2012-05-10 4 views
6

Я разработал приложение для обнаружения лица с использованием обнаружения каскадных поверхностей OpenCVs HAAR. Алгоритм работает отлично, однако каждый раз в то время он находит узоры на стене или предметы, которые не являются лицами.
Я хочу выполнить дополнительные проверки объекта, подозреваемого в качестве лиц, но я хочу сделать это только на объектах, на которых я не уверен, что они лица. Есть ли способ получить «доверительный» уровень для лица, обнаруженного с помощью обнаружения каскадного сигнала HAAR?Есть ли способ получить измерение уровня достоверности при использовании определения лица с помощью OpenCV?

ответ

3

OpenCV фактически находит несколько результатов для любого конкретного объекта, причем каждая обнаруженная область в основном перекрывает друг друга; Затем они группируются вместе и образуют число «числа соседей». Этот счет - так называемая уверенность.

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

1

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

Я смог запустить 3 каскада одновременно на iPhone-канале iPhone в режиме реального времени, поэтому производительность не должна быть проблемой во многих нормальных сценариях. Подробнее здесь: http://rwoodley.org/?p=417

5

OpenCV обеспечивает доверие с помощью аргумента «весов» в функции «detectMultiScale» из класса CascadeClassifier, вам нужно поставить флаг «outputRejectLevels» истинной

+1

Этот параметр доступен для openCV C++ API? Я просто вижу это в API-интерфейсе python?!? Например, существует недокументированный способ использования параметра flags для этой цели? – Micka

+0

[Видимо] (http://code.opencv.org/issues/3064) есть и недокументированная функция в C++ API. 'Недействительным CascadeClassifier :: detectMultiScale (Const Mat & изображения, векторные и объекты, вектор & rejectLevels, вектор & levelWeights, двойной scaleFactor, внутр minNeighbors, Int флаги, размер minObjectSize, размер maxObjectSize, BOOL outputRejectLevels)' – sietschie

0

не прямой ответ на ваш вопрос , но это может помочь в уменьшении ложного обнаружения.

Вы можете получить менее ложное обнаружение путем настройки MinNeibhbours, CV_HAAR_FIND_BIGGEST_OBJECT и значений размера.

int MinNeighbours = 7;

face_cascade.detectMultiScale (frame_gray, faces, 1.1, MinNeighbours, CV_HAAR_FIND_BIGGEST_OBJECT, размер (60, 60));