1

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

Рамка обнаружения объекта Viola-Jones: Этот алгоритм реализован в OpenCV как cvHaarDetectObjects(). https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework Локальные бинарные шаблоны (LBP) представляет собой тип функции используется для классификации в области компьютерного зрения https://en.wikipedia.org/wiki/Local_binary_patterns 3 .....

я просто новичок, и я хочу знать, что это лучший алгоритм (с точки зрения скорости и производительности и точности) для лица и особенно обнаружение глаз с использованием opencv :) большое спасибо

обновление: для моей ситуации мне нужно захватить лица людей, идущих по улице с расстояния ~ 2 -5 метров, я использую малину pi 2 с opencv 3 gold и raspicam-0.1.3 libarrry для модуля pi-камеры

ответ

3

По моему опыту лучшим является Haarcascade. Файл, который я использую, - haarcascade_frontalface_alt2.xml. Я сделал много тестов со всеми файлами хара и обнаружил, что этот был лучшим.

std::vector<Rect> faces; 
Mat img_gray; 
Mat img; //here you have to load the image 

CascadeClassifier face_cascade; 
face_cascade.load("haarcascade_frontalface_alt2.xml"); 

cvtColor(img, img_gray, CV_BGR2GRAY); 
cv::equalizeHist(img_gray, img_gray); 

int rect_size = 20; 
float scale_factor = 1.05; 
int min_neighbours = 1; 
face_cascade.detectMultiScale(img_gray, faces, scale_factor, min_neighbours, 0|CV_HAAR_SCALE_IMAGE, Size(rect_size, rect_size)); 

Haar cascade возвращает несколько ограничительных рам (они являются кандидатами). Некоторые из этих кандидатов будут содержать лицо, а другое нет. Если большинство пикселей ограничительной рамки зеленые, то, вероятно, нет лица. Вам необходимо фильтровать цветные пиксели. Вы можете сделать это с помощью HSV. Сначала вам нужно установить диапазон, в нашем случае этот диапазон допускает только цветные пиксели.

cv::Scalar hsv_min = cv::Scalar(0, 30, 60); 
cv::Scalar hsv_max = cv::Scalar(20, 150, 255); 
cvtColor(image, hsv_image, CV_BGR2HSV); 
inRange (hsv_image, hsv_min, hsv_max, result_mask); 

result_mask - это маски для кожи. Все пиксели в белом - это кожа, а все в черном - не кожа. Тогда вам нужно только подсчитать количество белых пикселей в маске:

int number_skin_pixels = cv::countNonZero(result_mask); 

Если есть много кожи пикселей, то youo можно предположить, что существует грань. Если нет, то есть ложный положительный

+0

ОК Спасибо, я пробовал ... у вас есть идея о том, как оптимизировать код в faceetct.cpp, потому что есть много параметров ... Я также проверил с lbpcascade_frontalface.xml. и это обеспечивает хорошее обнаружение ... для моей ситуации мне нужно захватить лица людей, идущих по улице –

+0

@ user3530803 lpd быстрее, но менее точен, чем хара. Я отредактировал свой ответ, чтобы добавить пример, который вам может понадобиться. –

+0

@ user3530803 Параметры scale_factor и min_neighbours являются ключами для повышения точности. Значения, которые я положил, работают очень хорошо, если вы ищете лицо в не загроможденной среде (например, изображение только одного человека). Если у вас много людей в вашем изображении или грязном фоне, вам нужно немного изменить эти значения –

2

Если вам нужен только детектор лица, детектор объекта Viola-Jones быстро и очень точно. Классификаторы каскада Haar для обнаружения глаз включены в OpenCV.

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

Смежные вопросы