Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446

Распознование образов. Матчасть. Алгоритм Слежения за объектом

24.09.2014, 23:24. Показов 5950. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Возможно ошибся адресом.

Интересуют алгоритмы слежения за движущимися объектами.

Прошу у гуру помощи, а имеено посоветуйте толковую книгу.

Меня интересует именно математический аппарат.

З.Ы. В НЕТЕ толкового ничего найти не получилось. Тема довольно такая специфическая. И нормальных статей по распознованию найти не получилось. На хабре было что-то но не то, что нужно.

Заранее спс!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2014, 23:24
Ответы с готовыми решениями:

Распознование образов(C#)
Люди помогите пожалуйста: Задание: Программно реализовать нейронную сеть, обучаемую по правилу Хебба, для решения задачи распознавания...

опять распознование образов
Мы делаем большие радиоуправляемые модели танков ( можете глянуть на www.interdacom.ru/~tanks ) работаем над аттракционом ( танковый бой )...

Распознование образов: цифр, букв, и т.д. с помощью нейронных сетей
Кто может помоч по поводу распознования образов: цифр, букв, и т.д. с помощью нейронных сетей.

23
2628 / 1640 / 266
Регистрация: 19.02.2010
Сообщений: 4,352
28.09.2014, 23:48
Непонятны условия (поворачивается ли камера, насколько между кадрами меняется фон,..., да каковы особенности объекта, в конце концов).
А начинать можно с методов оптического потока (optical flow) - это Лукас-Канаде, Хорн-Шунк, ещё вроде кто-то. также - методы mean-shift, camshift.
В книгах по анализу-распознаванию видео - часто описываются, как в обобщённых - так и в более специфических (например, методы эти запрограммированы в библиотеке OpenCV - поэтому описаны как минимум в одной из двух или трёх книг по этой самой OpenCV).
Раздел - да, наверно не математика а алгоритмы.
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
29.09.2014, 02:30  [ТС]
Камера двигаться не будет(предпологается использовать web камеру ноутбука)
Фон будет серым, сплошным, неизменчивым.
На фоне будет двигаться рука, показывая определенные жесты. Цель : словить эту руку, распознать жест.
Собственно интересуют методы, с помощью которых это можно реализовать.
В OpenCV есть метод "surf", который у изображения находит характерные точки, и им присваивает 128 битные дескрипторы по которым, далее, можно будет сравнить изображения и понять, какая часть сдвинулась(это для того что бы руку выделить).
У меня пока что поверхностное представление.
Буду рад услышать какие-либо соображения.
*сюрфом лучше работать с 2мя соседними кадрами, иначе будет накапливаться ошибка.
**За книги и методы спасибо. Буду изучать.
0
2628 / 1640 / 266
Регистрация: 19.02.2010
Сообщений: 4,352
01.10.2014, 00:59
some_name, ну тогда не слежение за объектом - а просто вычитание фона (background subtraction).
В OpenCV для этого есть функция. Но метод там реализован 2005года, т.е. довольно древний (с тех пор научный прогресс был достаточно значимым, но эти новые методы нужно будет программировать самому).

По распознаванию жестов - гуглим hand gesture recognition algorithm и среди кучи статей что-нибудь выбираем. Может, и не надо будет предварительно отделять объект от фона.

ЗЫ. В том посте называл не фамилии авторов книг, а фамилии авторов методов
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
01.10.2014, 01:26  [ТС]
Спасибо
0
Заблокирован
03.10.2014, 20:01
Хорошую литературу вы вряд ли найдёте. Ваш вопрос
имеет отношение к военной технике, а такие вещи не
раскрываются. Но вы можете сами кое-что сделать
при большом желании. Начните с простого:
Чёрный фон и белая точка. Напишите программу, которая
вычисляет координаты этой точки.
Следующим шагом будет движущая точка. Напишите код,
где дополнительно вычисляется скорость точки и ее
направление движения (координаты скорости и модуль)
Третьим шагом будет точка, которая движется на вас или
от вас. Ее размеры изменяются. Добавьте код, определяющий
расстояние до точки. Просто положите условно 1 пиксель это
1 км. Значит 4 пикселя - 500 метров.
И так шаг за шагом вы дойдете до нужного вам объекта.
P.S.
Задача достаточно сложна и многогранна
Так что выберете себе, что вам надо ...
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
02.11.2014, 14:15  [ТС]
Перепобовал много всякого. Пока остановился на вычитании соседник кадров в видеоряде:

Кликните здесь для просмотра всего текста

После бинаризации по проценту(90) получаю вот такое:
Кликните здесь для просмотра всего текста


Каким макаром, можно выделить светлую цельную область? Пробовал делать так: нахожу точку с найбольшей яркостью. Из этой точки начинаю искать соседей по 8-ми связности, у когорых яркость > 15. Результат вы видите на снимке. Можно конечно проходить по всему изображения, искть светлые пикселы, но это вообще ггг.

Заранее спс!
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
07.11.2014, 22:28  [ТС]
Помогите плз разобраться, что имеется ввиду:


В первом пунке говрится примерно следующее:
"Мы пологаем, что на вход подается матрица, тогда ее средний вектор вычисляется..."
Вопрос: Как понять эту формулу?

Во втором пунке говорится примерно следующее:
"Следующим шагом является получение ковариантной матрицы С из Х...."
Вопрос: Как понять эту формулу?

В третьем я пока толком не въехал.
Ну и вопрос, как понять эту формулу?

Заранее спс!
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
09.11.2014, 21:40
some_name, в первом "E" - это, наверно, сумма (https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum).
А в 3 типа умножение матрицы на разность матриц (там во всех формулах операции над ними).
0
2628 / 1640 / 266
Регистрация: 19.02.2010
Сообщений: 4,352
09.11.2014, 22:03
не сумма - а среднее (мат.ожидание, expectation - отсюда и буква E в формуле). Ясно же сказано в тексте - mean.
1
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
09.11.2014, 22:30
Точняк, оказывается, "the mean" = "среднее", а я подумал, что это типа "значение". Хотя далее можно было увидеть, что вычитается из матриц, значит M не просто число. Невнимательно
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
09.11.2014, 23:35  [ТС]
Спасибо за помощь! Я думал умерли все.

На данный момент удалось прикрутить детектор Кэнни. Получаю вот такое:


Уже 3 день мозг ломаю, как эту руку выделить. Спать не могу спокойно.

Есть у кого-нибудь идеи.

Заранее спс!
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
14.11.2014, 00:23  [ТС]
Народ, подскажите плз, как мне выделить черную замкнутую область на изображении, если я знаю координаты одной точнки, которая принадлежит этой области?

Наподобие такого:


Пробовал по связности, но получаю ехепшн, памяти не хватает. Оно и не удивительно.
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void recursice(int x, int y) {
        
        if(y < 1 || y >= height - 1 || x < 1 || x >= width - 1) return;
                
        if(pixelsData[width * y + x] == AbstractTool._1) pixelsData[width * y + x] = Color.GREEN.getRGB();
        
        if (pixelsData[width * (y - 1) + (x - 1)] == AbstractTool._1) recursice(x - 1, y - 1);
        if (pixelsData[width * (y - 1) + x        ] == AbstractTool._1) recursice(x, y - 1);
        if (pixelsData[width * (y - 1) + (x + 1)] == AbstractTool._1) recursice(x + 1, y - 1);
 
        if (pixelsData[width * y + (x - 1)        ] == AbstractTool._1) recursice(x - 1, y);
        if (pixelsData[width * y + (x + 1)        ] == AbstractTool._1) recursice(x + 1, y);
 
        if (pixelsData[width * (y + 1) + (x - 1)] == AbstractTool._1) recursice(x - 1, y + 1);
        if (pixelsData[width * (y + 1) + x        ] == AbstractTool._1) recursice(x, y + 1);
        if (pixelsData[width * (y + 1) + (x + 1)] == AbstractTool._1) recursice(x + 1, y + 1);
    }


Как еще можно?
0
2628 / 1640 / 266
Регистрация: 19.02.2010
Сообщений: 4,352
16.11.2014, 22:22
some_name, так сделайте точно так же, но без рекурсии

Щас мозги уже не работают - мне сложно обдумать все возможные проблемы (например, если строка пикселов со стартовой точкой будет "разрывной" - когда старт попадёт куда-то в середину пальцев). Но вроде бы алгоритм получается посложнее, чем если просто, без всякой стартовой точки, идти сверху-вниз по картинке и выделять на ней объект (или отдельные несмежные объекты).
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
17.11.2014, 09:06  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
так сделайте точно так же, но без рекурсии
массивом с двумя указателя?

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Щас мозги уже не работают - мне сложно обдумать все возможные проблемы
Как я вас понимаю. Уже который день сокрушаюсь над этими проблемами.
Кроме Кенни, по сути, ничего и подходит. Но в тоже время порождает множества других проблем, которые вы назвали.
Эххх...

З.Ы. Читаю вот эту статью.
Может знает кто-нибудь что за Karhunen-Loeve Transform и каким боком оно там используется. Понятного объяснения не нашел пока.
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
17.11.2014, 09:58
Цитата Сообщение от some_name Посмотреть сообщение
Пробовал по связности, но получаю ехепшн, памяти не хватает.
Памяти хватает, а вот стек переполняется. Уменьши количество вызовов до четырех, т.к. достаточно проверять только верхний/нижний/правый/левый пикселы. Если этого будет не достаточно, увеличь размер стека.
1
2628 / 1640 / 266
Регистрация: 19.02.2010
Сообщений: 4,352
23.11.2014, 22:06
Цитата Сообщение от some_name Посмотреть сообщение
что за Karhunen-Loeve Transform и каким боком оно там используется.
Это метод главных компонент (один из возможных алгоритмов и одно из возможных названий). http://dic.academic.ru/dic.nsf/ruwiki/1105603 - хорошее описание.

В данном случае (в указанной Вами статье) - авторы сводят все точки контура (вернее, ковариационную матрицу для этих точек) в 2 вектора (см там картинку 8) в двумерном пространстве (в пространстве координат х,у). Получают информативные признаки (углы наклона векторов, углы между векторами - но таки ничего, кроме угла наклона первой главной компоненты авторы не использовали, т.е. есть возможность улучшить их результат), заодно делают распознавание инвариантным к размеру картинки и ладони на ней (контур любой длины описывается через два вектора в двумерном пространстве).
Почему я тут сказал про угол между главными компонентами. Обычно г.к. делают ортогональными, т.е. угол всегда будет 90градусов и как информативный показатель выступать не может. Но - см в статье рис.8, там ортогональности нет. Вернее, всё ещё будет зависеть и от метода расчёта - используется ли там обязательно добавочный шаг ортогонализации (Грам-Шмидт, например), или нет.
Рассчитываться всё должно мгновенно - работа идёт с ковариационной матрицей размером 2*2, её построение займёт куда больше времени.
В общем, неплохая идейка в статье, вполне рабочая.
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
24.11.2014, 00:37  [ТС]
Что за странный способ фильтрации по Гауссу?
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
private float gaussian(float x, float sigma) {
 
        return (float) Math.exp(-(x * x) / (2f * sigma * sigma));
    }
     
    // gradient computation 
    private void computeGradients(float kernelRadius, int kernelWidth) {
            // generate the gaussian convolution masks
            float kernel[] = new float[kernelWidth];
            float diffKernel[] = new float[kernelWidth];
            int kwidth;
            for (kwidth = 0; kwidth < kernelWidth; kwidth++) {
                float g1 = gaussian(kwidth, kernelRadius);
                if (g1 <= GAUSSIAN_CUT_OFF && kwidth >= 2) break;
                float g2 = gaussian(kwidth - 0.5f, kernelRadius);
                float g3 = gaussian(kwidth + 0.5f, kernelRadius);
                kernel[kwidth] = (g1 + g2 + g3) / 3f / (2f * (float) Math.PI * kernelRadius * kernelRadius);
                diffKernel[kwidth] = g3 - g2;
            }
 
            int initX = kwidth - 1;
            int maxX = width - (kwidth - 1);
            int initY = width * (kwidth - 1);
            int maxY = width * (height - (kwidth - 1));
 
            // perform convolution in x and y directions
            for (int x = initX; x < maxX; x++) {
                for (int y = initY; y < maxY; y += width) {
                    int index = x + y;
                    float sumX = data[index] * kernel[0];
                    float sumY = sumX;
                    int xOffset = 1;
                    int yOffset = width;
                    for (; xOffset < kwidth;) {
                        sumY += kernel[xOffset] * (data[index - yOffset] + data[index + yOffset]);
                        sumX += kernel[xOffset] * (data[index - xOffset] + data[index + xOffset]);
                        yOffset += width;
                        xOffset++;
                    }
 
                    yConv[index] = sumY;
                    xConv[index] = sumX;
                }
            }
 
            for (int x = initX; x < maxX; x++) {
                for (int y = initY; y < maxY; y += width) {
                    float sum = 0f;
                    int index = x + y;
                    for (int i = 1; i < kwidth; ++i)
                        sum += diffKernel[i] * (yConv[index - i] - yConv[index + i]);
 
                    xGradient[index] = sum;
                }
            }
 
            for (int x = kwidth; x < width - kwidth; x++) {
                for (int y = initY; y < maxY; y += width) {
                    float sum = 0.0f;
                    int index = x + y;
                    int yOffset = width;
                    for (int i = 1; i < kwidth; ++i) {
                        sum += diffKernel[i] * (xConv[index - yOffset] - xConv[index + yOffset]);
                        yOffset += width;
                    }
 
                    yGradient[index] = sum;
                }
 
            }
    }

3 часа пытаюсь понять как это работает.

Вот на таком изображении
Кликните здесь для просмотра всего текста

Название: png.png
Просмотров: 267

Размер: 47.1 Кб

получаются следующие результаты:
Кликните здесь для просмотра всего текста


Я так понял, там строится вектор из значений функций Гаусса. Этот вектор протягивается вдоль, поперек - получается 2 вектора - результаты протяжки.

Потом по каким-то магическим формул выделяются границы. При этом не похоже что там используется оператор Собеля.

Как это работает?

Заранее спс!
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
25.11.2014, 01:13  [ТС]
А всегда ли собственных векторов будет получаться 2?

Прочитав статью и доп. инфу. понял, что количество собственных чисел равно порядку матрицы, а количество собственных векторов равно количеству собственных чисел, с учетом их кратности.
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
25.11.2014, 01:16  [ТС]


как они получили вот эти два вектора? Т.е. я как бы понимаю порядок их вычисления. Но почему их именно 2?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.11.2014, 01:16
Помогаю со студенческими работами здесь

Алгоритм распознавания образов нейронной сетью
Доброго времени суток. Не могу понять такой момент. Даны изображения букв, представленные битовой матрицей, которые подаются на входы...

Где найти реализованный алгоритм распознавания образов
Здравствуйте! Пишу магистерскую работу, результатом которой будет алгоритм распознавания образов, реализованный на базе когнитрона или...

Цикл For, матчасть
Есть ли разница между: res = function() for list in res: .... и: .... for list in function(): .... Если...

Метод с двумя параметрами: операцией над объектом и объектом
Мне нужно сделать статичный метод Write который будет принимать два параметра операция над объектом( например: add, remove, set) и сам...

Линковка, статические, динамические библиотеки - матчасть
Парился сегодня целый день, компиля cUrl c MinGW с поддержкой https - т.е. с OpenSSL и zlib. Долго мучался, ив процессе понял, что имею...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru