Перейти к содержимому
Compvision.ru
ProgerX

Как распознавать жесты пальцев?

Recommended Posts

Хочу попытаться сделать что-то типа такого:

но опыта очень и очень мало в распознавании образов, а в программировании, обратно - достаточно :) Только на одном опыте программинга далеко в этом деле не уедешь.

Можете что-то порекомендовать? В какую сторону хотя бы смотреть? На какие алгоритмы стоит обратить внимание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Хочу попытаться сделать что-то типа такого:

но опыта очень и очень мало в распознавании образов, а в программировании, обратно - достаточно :) Только на одном опыте программинга далеко в этом деле не уедешь.

Можете что-то порекомендовать? В какую сторону хотя бы смотреть? На какие алгоритмы стоит обратить внимание?

Что то это очень очень напоминает метод главных компонент :) или, в простонародье, principal component analysis (PCA)

Пример здесь

Хотя скрытые марковские модели (по английски HMM (для google)) наверное надежнее будут.

Пример здесь

Мне еще вот это нравится:

а это уже деформируемые модели, родственные жадным змеям, но только сложнее малость.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за информацию!

По поводу видео.. А что в нём особенного? Когда я его смотрел раньше - сразу в голову пришло просто решение:

1. Фоткает фон без руки

2. Снимает руку камерой

3. Выделяет разницу => остаётся одна (например) белая рука на чёрном фоне. Выделить контуром - просто отступить на некоторое расстояния в стороны :)

С определением клика сложнее конечно. Ну тут я ничего придумать не могу.. кроме как определения длины нужного пальца в процентном соотношении :)

Кстати, а для подобных штук обычные веб-камеры подходят? Или они какие-то высокого разрешения используют?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо за информацию!

По поводу видео.. А что в нём особенного? Когда я его смотрел раньше - сразу в голову пришло просто решение:

1. Фоткает фон без руки

2. Снимает руку камерой

3. Выделяет разницу => остаётся одна (например) белая рука на чёрном фоне. Выделить контуром - просто отступить на некоторое расстояния в стороны :)

С определением клика сложнее конечно. Ну тут я ничего придумать не могу.. кроме как определения длины нужного пальца в процентном соотношении :)

Кстати, а для подобных штук обычные веб-камеры подходят? Или они какие-то высокого разрешения используют?

Хочу предупредить, что методы PCA и HMM чувствительны к повороту и к тому же выловленную картинку придется масштабировать в некий стандартный размер.

Я еще про моменты Ху :) ( Hu moments ) забыл, они не имеют зависимости от масштаба и поворота, а характеризуют именно форму контура.

В офиц. руководстве (от Интел) это есть.

Для таких вещей как анализ контура во втором случае идеально подходит. На форуме еще примеры по контурам были. (Определение похожести контуров).

Камеры высокого разрешения, конечно хорошо, но не нужно забывать и о потоке обрабатываемой информации. Чем больше разрешение - тем больше задержки по времени, и от этого меньше точность алгоритмов завязанных на скорость поступления видеоданных, например "шаблоны движения" или "оптический поток".

В тех роликах, я думаю, применяется разрешение 640х480, таких камер уже достаточно много. И скорость работы приемлемая. У меня такая на Asus EEE установлена, OpenCv притормаживает, но в целом сносно работает.

ЗЫ: Там (в ролике) фон динамический, есть разница :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ЗЫ: Там (в ролике) фон динамический, есть разница :)

О блин, а вот этого я совершенно не заметил! :)

Тогда, конечно, ясное дело, что разница тут огромная!

А с поворотом как быть? Самому уже как-то определять угол поворота и разворачить? Затем масштабировать, а уж после этого подсовывать распознавательным методам..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
О блин, а вот этого я совершенно не заметил! :)

Тогда, конечно, ясное дело, что разница тут огромная!

А с поворотом как быть? Самому уже как-то определять угол поворота и разворачить? Затем масштабировать, а уж после этого подсовывать распознавательным методам..

Ну, если руки не выворачивать, то я думаю и без разворота можно обойтись :)

А если выворачивать, то вписывать в эллипс и разворачивать ориентируясь на большую ось (на самом деле на ось инерции фигуры). Или использовать момент товарища Ху ему без разницы угол и масштаб, ему форма важна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это Вы имеете ввиду оценку по схожести контуров?

Вообще контуры очень хорошая вещь, но вот только на них далеко не уедешь с жестами.. особенно если в дальнейшем прийдётся различать тыльную и.. э.. нетыльную :) сторону ладони, если важен будет её поворот.. (вертикальные, горизонтальные жесты и т.д.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Это Вы имеете ввиду оценку по схожести контуров?

Вообще контуры очень хорошая вещь, но вот только на них далеко не уедешь с жестами.. особенно если в дальнейшем прийдётся различать тыльную и.. э.. нетыльную :) сторону ладони, если важен будет её поворот.. (вертикальные, горизонтальные жесты и т.д.)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И еще ролик, там как раз с контурами работают

А здесь тоже круто

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Довольно медленно получается у первого ролика распознавать жесты (по сравнению с другими распознаваниями, типа

). Или потому что у этого жестов больше..

Интересно, удобно ли рукой управлять компьютером? Есть ли перспектива у таких методов управления...

Во втором - это находится средняя/скелет у контурной фигуры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Довольно медленно получается у первого ролика распознавать жесты (по сравнению с другими распознаваниями, типа
). Или потому что у этого жестов больше..

Интересно, удобно ли рукой управлять компьютером? Есть ли перспектива у таких методов управления...

Во втором - это находится средняя/скелет у контурной фигуры?

Я не знаю как он рассчитывает во втором ролике, но подозреваю что там ищется несколько конечных точек (голова и ладони), и вместе с расчетом обратной кинематики (на которую наложены ограничения по подвижности суставов), получается довольно точно.

Насчет управления компом при помощи жестов, мне кажется это удобно лишь в небольшом количестве специальных случаев.

То же что и с сенсорными кнопками, не очень удобно (без тактильной обратной связи), но в ряде случаев без них не обойдешься.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, товарищи :(.

Подскажите в какую сторону копать, с изображением раньше не работал, информации мало.

Задача: распознать геометрию ладони, т.е. размеры пальцев, форму, фаланги, расстояние между пальцами, и т.д. вообщем вся геометрия. Причём выделить количественные показатели всех этих параметров для удобного сравнения, идентификации. По какому принципу вообще это происходит? Не могу перенастроить мозг для работы с библиотекой.

По умолчанию фон будет белым. Спасибо за помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Здравствуйте, товарищи :(.

Подскажите в какую сторону копать, с изображением раньше не работал, информации мало.

Задача: распознать геометрию ладони, т.е. размеры пальцев, форму, фаланги, расстояние между пальцами, и т.д. вообщем вся геометрия. Причём выделить количественные показатели всех этих параметров для удобного сравнения, идентификации. По какому принципу вообще это происходит? Не могу перенастроить мозг для работы с библиотекой.

По умолчанию фон будет белым. Спасибо за помощь.

Почитайте это:hands.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за хорошую наводку.

Делаю пока по пунктам, как только дойду до сложного, отпишусь с вопросами :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Остановился на геометрии.

Кто подскажет, какие существуют функции для работы с контурами?

Learning OpenCV читал, но как то сложновато вникнуть. Хочется посмотреть на чей нибудь практический опыт, на конкретном примере в стиле helloworld.

То есть нужно определять точки перегибов, конкретные углы и т.д., чтобы как то дальше работать с любой областью на ладони.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Остановился на геометрии.

Кто подскажет, какие существуют функции для работы с контурами?

Learning OpenCV читал, но как то сложновато вникнуть. Хочется посмотреть на чей нибудь практический опыт, на конкретном примере в стиле helloworld.

То есть нужно определять точки перегибов, конкретные углы и т.д., чтобы как то дальше работать с любой областью на ладони.

Это осилили ?: http://ru.wikipedia.org/wiki/%D0%94%D0%B8%...%B2%D1%8B%D1%85

Точки из найденного контура доставать дело не хитрое :)

Пару-тройку функций подкину:

//---------------------------------------------------------------------------
// сплайн
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// m - число точек опрорной ломаной
// DIV - степень дробления шага
// N=( (m-3)*DIV + 1 ) - количество точек в результате
//---------------------------------------------------------------------------
void bspline(CvPoint2D32f *p,int m,int div,CvPoint2D32f* output)
{
double t;
double dt=1/(double)div;

double s;
double t2;
double t3;
double s3;
double k1;
double k2;

int first=0;

for (int i=1;i<m-2 ;i++)
{
t=0;
for (int d=0;d<=div ;d++)
{
s=1-t;
t2=t*t;
t3=t2*t;
s3=s*s*s;
k1=3*t3-6*t2+4;
k2=(-3*t3+3*t2+3*t+1);
output[first+d].x=(s3*p[i-1].x+k1*p[i].x+k2*p[i+1].x+t3*p[i+2].x)/6;
output[first+d].y=(s3*p[i-1].y+k1*p[i].y+k2*p[i+1].y+t3*p[i+2].y)/6;
t+=dt;
}
first+=div;
}
}

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------


Читалка с файла / рисовалка точек:

CvSeq *result;

CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_READ );
CvFileNode* fn= cvGetFileNodeByName( fs, cvGetRootFileNode(fs), "result" );
result=(CvSeq*)cvRead( fs, fn );

int m=result->total;

// Объявление читалки точек
CvSeqReader reader;
// Инициализация читалки точек
cvStartReadSeq( result, &reader, 0 );
// Точка
CvPoint pt;
// Достаем точки из хранилища точек и рисуем линии
for (int i=0;i<m;i++)
{
CV_READ_SEQ_ELEM( pt, reader );
pts[i].x=pt.x;
pts[i].y=pt.y;
сvCircle(image,cvPoint(pts[i].x,pts[i].y),2,CV_RGB(0,255,0));
}

cvReleaseFileStorage( &fs );

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------


Запись контура в файл

CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_WRITE );
cvWrite( fs, "result", result, cvAttrList(0,0) );
cvReleaseFileStorage( &fs );

//-----------------------------------------------------------------------------
[/code]

ЗЫ: Куски нарезал из программ, может что пропустил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Благодарю)

Таак.

Как делать понял. Сделал. Тут вопросов нету, осталось только думать над алгоритмами поиска нужных параметров, а это уже дело технки. Благо, геометрия была у меня когда то в детстве любимым предметом, наконец я применю её хоть где то :)

Если только не будет слишком невыполнимых задач)

Но вот есть новые вопросы по OpenCV:

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

С помощью каких инструментов это делается? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Благодарю)

Таак.

Как делать понял. Сделал. Тут вопросов нету, осталось только думать над алгоритмами поиска нужных параметров, а это уже дело технки. Благо, геометрия была у меня когда то в детстве любимым предметом, наконец я применю её хоть где то :)

Если только не будет слишком невыполнимых задач)

Но вот есть новые вопросы по OpenCV:

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

С помощью каких инструментов это делается? :)

Например cvCalcBackProject погуглите, и вообще, без гистограмм, думаю трудно обойтись будет.

Еще пригодится cvEqualizeHist.

Если известна примерная ориентация ладони, можно попробовать еще считать градиент по горизонтали или вертикали, в зависимости от ориентации, это даст повышенную яркость либо горизонтальных, либо вертикальных переходов (cvSobel).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Остальные методы так же отказывают из за того, что не получается убрать фон из изображения, а он убивает все попытки сделать изображение поконтрастней или выделить конкретные повышения яркости. :(

Думаю, что нужно выделять конкретно каждый палец и работать с ним, это даст какую то определённость. По сути нужно только найти размеры фаланг и границу пальцев с внешней стороны(там где нет изгибов контура как во внутренних сторонах). Нет такой возможности работать с изображением внутри, к примеру, контура, или можно только в прямоугольнике?

P.S. Может сегментация?

Поделиться сообщением


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

Остальные методы так же отказывают из за того, что не получается убрать фон из изображения, а он убивает все попытки сделать изображение поконтрастней или выделить конкретные повышения яркости. :(

Думаю, что нужно выделять конкретно каждый палец и работать с ним, это даст какую то определённость. По сути нужно только найти размеры фаланг и границу пальцев с внешней стороны(там где нет изгибов контура как во внутренних сторонах). Нет такой возможности работать с изображением внутри, к примеру, контура, или можно только в прямоугольнике?

P.S. Может сегментация?

Почти у всех функций opencv есть параметр mask , он дает Вам возможность работать с областями любой конфигурации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Почти у всех функций opencv есть параметр mask , он дает Вам возможность работать с областями любой конфигурации.

Всё таки не разобрался с маской. Она есть только у "арифметических" операциях, а это всё равно ничего не даст. Если я правильно понимаю работу с изображениями. addaptiveshreashosd дал какой то намёк, но очень тонкий) Всё таки проще будет брать прямоугольники от кончиков пальцев и до основания и их по Собелю смотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здраствуйте.Мне нужно написать программку определяющую движение руки вправо,влево,вверх,вниз.Какой лучший для этого подход?Motion templates?Изначально на кадре ничего нет,затем проходит рука и нужно например выдать-движение вправо.Насколько я смог понять пример из книги по motion templates,то мне нужно загрубить определение движения всяких других мелких объектов.Подскажите кто с этим работал

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробовал стандартный пример из OpenCV с motion templates - достаточно правильно определяется движение руки. А в чём конкретно проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я как раз этим примером и пользовался.Если например загрубить определение следующим образом

else { // i-th motion component

comp_rect = ((CvConnectedComp*)cvGetSeqElem( seq, i ))->rect;

if( comp_rect.width + comp_rect.height < 4000 ) // reject very small components

continue;

color = CV_RGB(255,0,0);

magnitude = 30;

то есть 4000,вместо 100(или просто довольно крупное число,чтобы отбросить мелкии движения),то впринципе определяется рука,но например при движении вверх руки как то нечетко определяется,либо наооборот слишком четко,то есть показывает движении вправо,вместо вверх.Как можно это исправить,и можно ли учитывать скажем после 5 секунд например с начала движения, а не сразу...?

А как например подход методом Лукас-Канада и слежением особых точек,не лучше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я как раз этим примером и пользовался.Если например загрубить определение следующим образом

то есть 4000,вместо 100(или просто довольно крупное число,чтобы отбросить мелкии движения),то впринципе определяется рука,но например при движении вверх руки как то нечетко определяется,либо наооборот слишком четко,то есть показывает движении вправо,вместо вверх.Как можно это исправить,и можно ли учитывать скажем после 5 секунд например с начала движения, а не сразу...?

Абсолютной точности добиться не получится. Хотя... Попробуй анализировать не всё изображение, а только вертикальную центральную часть. Что-то вроде:


cvSetImageROI(frame, cvRect(frame->width / 4, 0, frame->width / 2, frame->height));

// Тут поиск шаблонов...

cvResetImageROI(frame);

А как например подход методом Лукас-Канада и слежением особых точек,не лучше?
Да, будет гораздо точнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×