脸部的眼部检测(Eye detection within face)

2019-10-17 22:22发布

我想检测眼睛只属于脸部区域内,因此我做了一些小的改动的代码:

 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输出的代码和监控控制台。 但观察控制台后,我来到了,确实部分嵌套的对象是不工作的结论。 但是,我,为什么会是这样的嵌套对象的部分是类似于人脸检测部分依然毫无头绪。 因此,如果面部检测单元的作品,应该不是嵌套对象代码的工作吗?

(> _ <)

Answer 1:

请提供详细信息:

  1. 其中级联文件是您使用?
  2. 什么是高度和small_img的宽度是多少?

关于你的代码:

  1. 您正在使用nested_cascade变量没有初始化它。

通常-尝试使用haarcascade_mcs_eyepair_big.xml从OpenCV的文件与该参数:(图像,级联,存储,1.1,3,0,cvSize())或甚至与比例因子参数的较小的值。

我已经做了我写论文学士(视觉跟踪系统)中类似的东西,并用很简单的解决方案结束。 一开始,我试图找到内表面的所有“对象”可以是眼睛,然后决定哪一个是左眼,哪一个是正确的,但现在我不认为这是一个很好的解决方案。
最后我决定尝试搜索两只眼睛(对- haarcascade_mcs_eyepair_big.xml来自OpenCV的文件)在一次内表面( haarcascade_frontalface_default.xml ),我发现,这是更好的解决方案。 这是更快,更复杂的(你不必须决定哪些对象就是你正在寻找一个 - 如果你尝试有眼睛和其他一些东西ragard以前的位置也可以是相当复杂的),更容易实施。
准确性是对我不够好,速度也相当高(整个系统 - 约10-25fps - 这取决于几件事情)。 如果你想用你的代码进行实时眼检测我可以给你一些关于优化的更多详情。



Answer 2:

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()    


文章来源: Eye detection within face