Розпізнавання образів з opencv контури проти haartraining

Сам процес роботи з OpenCV передбачає попередні танці з бубном, про яких є досить докладних описів:

в тому числі і на Хабре:

Налаштування проекту під OpenCV від користувача skynoname. за які йому окреме спасибі!

Проба пера.

Перші плоди.

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

Показавши цю картинку в web-камеру, ви побачите спливаюче вікно зі знаком.

Знак поступися дорогою

Додам ще параметри середовища, з якими працює проект:

VC ++ Directories> Library Directories> C: OpenCV2.4.4opencvbuildx86vc10lib;
C / C ++> AdditionalIncludeDirectories> C: OpenCV2.4.4opencvbuildincludeopencv; C: OpenCV2.4.4opencvbuildinclude
Linker> General> Enable Incremental Linking> No (/ INCREMENTAL: NO)
Linker> Input>
opencv_video244d.lib;
opencv_ml244d.lib;
opencv_legacy244d.lib;
opencv_imgproc244d.lib;
opencv_highgui244d.lib;
opencv_core244d.lib;
opencv_objdetect244d.lib;

Муки творчості.

Домігшись виявлення одного знака, приступив до додавання розпізнавання другого знака. І тут почалися помилкові спрацьовування, програма плутала знаки і робота вкрай нестабільно. Додавав інші знаки просто копіюючи частина коду від поточного знака, і змінюючи змінні. Хотів зробити процедуру, але як то руки не дійшли, тому що зрозумів, що цей метод мені не цікавий. Вдаватися до порівняння за кількістю пікселів в контурі і подібних методів не став.

Другий акт танців з бубном.

У підсумку повернули в сторону тренування каскадів. «Покуривши» в цьому напрямку зрозумів що мені потрібні два інструменти createsampes і haartraining. Але їх exe`шнікі у мене були відсутні, а компілюватиметься відмовлялися. На той момент версія OpenCV у мене була 2.4.4, налаштована по першій статті. у другій же статті я вперше прочитав про використання Cmake при установці. У підсумку вирішив завантажити версію 2.3.1 і перевстановити бібліотеку. Після чого мені вдалося запустити потрібні інструменти через командний рядок і постало питання як з ними працювати. Всі крапки над «і» розставили статті, в яких показані параметри з якими потрібно запускати createsampes і haartraining з докладним описом цих параметрів.

Код з чистого аркуша.

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

Середу налаштовуємо точно так само як і в минулому проекті.

Повторення - батьки вчення.

Справа за «малим» навчити каскади.)
Тут починається найцікавіше. Після чого я вирішив писати про всі ці поневіряння на Хабре і просити поради.
Я заготовив 500 зображень розміром 1600х1200. і одне зображення зі знаком поступися дорогою розміром 80х80. Одного зображення буде досить, тому що ми детектуючи певний об'єкт, а не величезна різноманітність осіб.

Отже, заготовивши картинки і створивши файл neg.dat зі структурою

запускаємо файл opencv_createsamples.exe через CMD з наступними параметрами

Тобто утиліта обрізає bg-картинку під розмір позитивної картинки. Зміна параметрів -w і -h результату не дають і заднього фону все одно майже не видно. Якщо раптом хто знає в чому тут справа, поділіться міркуваннями. Розмір негативних зображень зменшував до 800х600 - результат той же.

Ну далі необхідно запустити opencv_haartraining.exe з параметрами

після чого ви отримаєте довгоочікуваний xml-файл, який можна довантажувати в вихідний код програми.
В результаті каскад злегка навчається і, з великою кількістю помилкових спрацьовувань, реагує на, любиться мені, картинку знака поступися дорогою.
Але я не можу домогтися точних спрацьовувань, як мені здається, через те що обрізається задній фон в позитивних зображеннях. І ніяк не вдаються картинки як в мануалах. Але залишається ще варіант збільшити кількість етапів навчання і, навантаживши свій комп'ютер на весь день, дочекатися поки каскад буде більш «освіченим». Чим я і планую зайнятися до появи інших ідей.