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

Стабилизация лицевых точек OpenCV

Recommended Posts

Добрый день,
Я сделал приложение на OpenCV + MFC для управления мышкой людьми с неврологическими нарушениям  https://preability.com/face-controlled-mouse/  Человек сидит и двигает головой перед вебкой ноутбука, мышка двигается, он улыбается – происходит клик и пр.

В целом, курсор удалось стабилизировать за счет отслеживания согласованного движения точек + EWMA фильтра (Калмана тяжелее и оказался не особо лучше). Разрежение угловых точек по всей площади тоже помогло немного. Но я вижу, что у похожей старой программы (eViacam) идет предварительная обработка изображения (с такими же древними внешними библиотеками для вебкамер). И за счет этого угловые точки стабильнее. 
Я включил equalizeHist() для ROI в области лица. В темноте детектор стал работать гораздо лучше. Но лицевые точки все равно пляшут при неровном освещении. Старая прога справлялась.
Я абсолютно не в теме предварительной обработки и хочу понять, что можно сделать с видео на входе дектектора? Пробовал подключить морфологию openCV, но не особо улучшил, зато нагрузил процессор. А у многих людей ноуты на целеронах. 
Подскажите, пожалуйста, кто в теме, как улучшить видео для детектора???

Не обязательно библиотеки OpenCV, главное на лету и не слишком нагружая процессор...

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


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

Здравствуйте, предварительныя обработка может убрать шум, если усрежнять кадры или делать морфологию, но, как вы заметили, это не сильно добавляет стабильности, за исключением некоторых редких случаев. 
Намного лучшие результаты дают фильтры по модели. Это предполагает, что лицо имеет меньше степеней свободы чем независимые точки в том количестве что выдает детектор. Если кратко то у точек 3*N степеней свободы, а у лица M + 6,  где N - количество точек, M - количество независимых групп мышц. 

Соответственно, точки не могут гулять как попало, они должны принадлежать модели. 
Есть параметрические модели лиц, например Basel Face model одна из наиьолее популярных, она довольно тяжелая, но можно достать из нее только нужные точки. 
Дальше линейная оптимизация, поможет сопоставить 2D и 3D, найти поворот, масштаб, смещение и параметры формы. 

Вот тут посмотрите: https://github.com/3d-morphable-models/curated-list-of-awesome-3D-Morphable-Model-software-and-data

  • Like 1

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


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

Отвечу на свой вопрос, может быть кому-то пригодится.

Christoph Rackwitz дал мне хороший совет: 

Цитата

Не отслеживайте всю голову. Отслеживайте каждую часть лица. И не используйте эти трекеры, они слишком сложные. Используйте MOSSE. Он тупой, но очень точный, пока объект (который должен быть крошечной частью лица) не сильно меняется.

MOSSE приближается к оптическому потоку. Методы расчета оптического потока работают так же, как MOSSE, за исключением того, что они используют более простую математику и меньшие области, поэтому результат более шумный. MOSSE использует большую площадь (для одного трека / точки, конечно) и более сложную математику для более точного результата.

Я изменил алгоритм. Когда угловые точки передаются алгоритму MOSSE, а не оптическому потоку то курсор ведет себя гораздо стабильнее. Возникла небольшая проблема с дискретным перемещением, поскольку рамки объектов перемещались одновременно на равное число пикселей. Поэтому и курсор двигался скачками. Поэтому пришлось устанавливать фильтр не на курсор, а на каждую точку. Но, как видно на видео, в итоге нагрузка на процессор не увеличилась.

https://www.youtube.com/watch?v=WKwuas0GVkA

1. Lucas-Kanade optical flow:

 

goodFeaturesToTrack(),

cornerSubPix(),

calcOpticalFlowPyrLK(),

cursor EWMA filter

 

2. MOSSE object tracking:

 

goodFeaturesToTrack(),

cornerSubPix(),

cv::legacy::TrackerMOSSE,

all points EWMA filtration

 

И, конечно, мне нужно было не забывать включить библиотеку tracking453.lib to Linker. Я потратил полдня, выясняя причину unresolved external symbol LNK2001 error при включении cv::legacy::Tracker. Почему то включение трекера из основной библиотеки (cv::Tracker) не приводило к этой ошибке компиляции, это сбивало с толку.

Basel Face model, если получится, попробую для отслеживания мимики. Smorodov, спасибо что обратили внимание!

  • Thanks 1

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


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

Посмотрите еще TLD tracker, ну и https://github.com/Smorodov/Multitarget-tracker   .
LK tracker быстрый, но не самый надежный вариант.
Я имею ввиду, комбинацию трекеров, простой и быстрый, для коротких треков, между вызовами сложных и точных, для захвата/восстановления трека. Это даст регулируесый уровень компромиса между надежностью и вычислительными затратами/плавностью трека.

Кстати, я как то делал проект с BFM : https://github.com/Smorodov/nano_bfm
И еще SMPL: https://github.com/Smorodov/nano_smpl 

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×