Обнаружение глаз внутри лица
Я пытаюсь обнаружить глаза, которые попадают только в область лица, и, следовательно, я сделал небольшие изменения в коде:
if( cascade )
{
double t = (double)cvGetTickCount();
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
1.1, 2, 0|CV_HAAR_DO_CANNY_PRUNING,
cvSize(30, 30) );
t = (double)cvGetTickCount() - t;
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
for( i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
CvMat small_img_roi;
CvSeq* nested_objects;
CvPoint center;
CvPoint center_1;
CvScalar color = colors[i%8];
int radius,radius_1;
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle( img, center, radius, color, 3, 8, 0 );
if( !nested_cascade )
continue;
else
printf("not continuing!\n");
cvGetSubRect( small_img, &small_img_roi, *r );
nested_objects = cvHaarDetectObjects( &small_img_roi, nested_cascade, storage,
1.1, 2, 0
|CV_HAAR_DO_CANNY_PRUNING, ,
cvSize(0, 0) );
for( j = 0; j < (nested_objects ? nested_objects->total : 0); j++ )
{
printf("start of nested objects loop!\n");
CvRect* nr = (CvRect*)cvGetSeqElem( nested_objects, j );
center_1.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
center_1.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
radius_1 = cvRound((nr->width + nr->height)*0.25*scale);
if(center_1.x+radius_1<center.x+radius&& center.x-radius<center_1.x-radius_1 && center_1.y<center.y+radius&& center.y<center_1.y+radius )
{
cvCircle( img, center_1, radius_1, color, 3, 8, 0 );
}
else
printf("cant find thy eyes!\n");
}
Однако это было не очень успешно. Пытаясь отладить его, я попытался закомментировать часть, где они рисуют круг для лица, в результате чего круги вообще не рисовались. Это привело меня к выводу, что, возможно, часть с вложенными объектами не работала. Следовательно, я реализовал несколько printfs в коде и следил за консолью. Но, посмотрев на консоль, я пришел к выводу, что действительно вложенные объекты не работали. Однако я все еще не понимаю, почему это так, поскольку часть вложенных объектов была похожа на часть обнаружения лица. Следовательно, если часть обнаружения лица работает, не должен ли работать и вложенный объектный код?
(> _<)
1 ответ
Пожалуйста, предоставьте больше информации:
- Какой каскадный файл вы используете?
- Какова высота и ширина small_img?
О вашем коде:
- Ты используешь
nested_cascade
переменная без инициализации.
Вообще - попробуй использовать haarcascade_mcs_eyepair_big.xml
файл из openCV с такими параметрами: (изображение, каскад, хранилище, 1.1, 3, 0, cvSize()) или даже с меньшим значением параметра scaleFactor.
Я сделал нечто подобное во время написания диссертации BSc (система Eyetracking) и закончил довольно простым решением. Вначале я пытался найти внутри лица все "объекты", которые могут быть глазами, а затем решить, какой из них левый, а какой правильный, но сейчас я не думаю, что это хорошее решение.
Наконец я решил попытаться найти оба глаза (пара - haarcascade_mcs_eyepair_big.xml
файл из opencv) сразу внутри лица (haarcascade_frontalface_default.xml
) и я узнаю, что это гораздо лучшее решение. Он быстрее, менее сложен (вам не нужно решать, какой объект вам нужен - это может быть довольно сложно, если вы попытаетесь получить неправильное предыдущее положение глаз и немного других вещей), и его легче реализовать.
Точность была достаточно хорошей для меня, а скорость была довольно высокой (вся система - около 10-25 кадров в секунду - это зависит от нескольких вещей). Если вы хотите использовать свой код для обнаружения глаз в реальном времени, я могу дать вам немного больше информации об оптимизации.
import cv2
#loading cascade
eye_Cascade=cv2.CascadeClassifier('haarcascade_eye.xml')
face_Cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
def detect(gray,frame):
faces=face_Cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w ,y+h),(255,0,0),2)
roi_gray=gray[y:y+h,x:x+w]
roi_color=frame[y:y+h,x:x+h]
eyes=eye_Cascade.detectMultiScale(roi_gray,1.1,3)
for(ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
return frame
video_capture=cv2.VideoCapture(0) #here 0 is used for inbuilt cam and 1 for
external cam
while True :
_,frame=video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
canvas = detect(gray, frame)
cv2.imshow('Face and Eye ', canvas)
#exit when user pressed 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()