Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
some_name
Вежливость-главное оружие
228 / 228 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
1

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

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

Здравствуйте!

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

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

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

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

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

Заранее спс!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2014, 23:24
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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


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

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



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

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


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

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

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

Заранее спс!
0
MLPMan
Кандёхаем веселее!
291 / 302 / 76
Регистрация: 02.10.2012
Сообщений: 2,104
09.11.2014, 21:40 9
some_name, в первом "E" - это, наверно, сумма (http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum).
А в 3 типа умножение матрицы на разность матриц (там во всех формулах операции над ними).
0
VTsaregorodtsev
591 / 546 / 79
Регистрация: 19.02.2010
Сообщений: 1,979
09.11.2014, 22:03 10
не сумма - а среднее (мат.ожидание, expectation - отсюда и буква E в формуле). Ясно же сказано в тексте - mean.
1
MLPMan
Кандёхаем веселее!
291 / 302 / 76
Регистрация: 02.10.2012
Сообщений: 2,104
09.11.2014, 22:30 11
Точняк, оказывается, "the mean" = "среднее", а я подумал, что это типа "значение". Хотя далее можно было увидеть, что вычитается из матриц, значит M не просто число. Невнимательно
1
some_name
Вежливость-главное оружие
228 / 228 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
09.11.2014, 23:35  [ТС] 12
Спасибо за помощь! Я думал умерли все.

На данный момент удалось прикрутить детектор Кэнни. Получаю вот такое:
Распознование образов. Матчасть. Алгоритм Слежения за объектом


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

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

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

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


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

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
VTsaregorodtsev
591 / 546 / 79
Регистрация: 19.02.2010
Сообщений: 1,979
16.11.2014, 22:22 14
some_name, так сделайте точно так же, но без рекурсии

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

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

З.Ы. Читаю вот эту статью.
Может знает кто-нибудь что за Karhunen-Loeve Transform и каким боком оно там используется. Понятного объяснения не нашел пока.
0
x128
182 / 169 / 36
Регистрация: 17.04.2010
Сообщений: 334
17.11.2014, 09:58 16
Цитата Сообщение от some_name Посмотреть сообщение
Пробовал по связности, но получаю ехепшн, памяти не хватает.
Памяти хватает, а вот стек переполняется. Уменьши количество вызовов до четырех, т.к. достаточно проверять только верхний/нижний/правый/левый пикселы. Если этого будет не достаточно, увеличь размер стека.
1
VTsaregorodtsev
591 / 546 / 79
Регистрация: 19.02.2010
Сообщений: 1,979
23.11.2014, 22:06 17
Цитата Сообщение от some_name Посмотреть сообщение
что за Karhunen-Loeve Transform и каким боком оно там используется.
Это метод главных компонент (один из возможных алгоритмов и одно из возможных названий). http://dic.academic.ru/dic.nsf/ruwiki/1105603 - хорошее описание.

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

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
Просмотров: 244

Размер: 47.1 Кб

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

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



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

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

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

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

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


как они получили вот эти два вектора? Т.е. я как бы понимаю порядок их вычисления. Но почему их именно 2?
0
25.11.2014, 01:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 01:16

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru