opencv - 面部内眼部检测

标签 opencv eye-detection

我试图检测只落在面部区域内的眼睛,因此我对代码做了一些小改动:

 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. 您使用的是哪个级联文件?
  2. small_img 的高度和宽度是多少?

关于您的代码:

  1. 您正在使用未初始化的 nested_cascade 变量。

通常 - 尝试使用来自 openCV 的 haarcascade_mcs_eyepair_big.xml 文件,参数为:(image, cascade, storage, 1.1, 3, 0, cvSize()) 甚至更小的 scaleFactor 参数值.

我在写我的理学士学位论文(眼动追踪系统)时做了类似的事情,并以非常简单的解决方案结束。一开始我试图在面部内找到所有可以是眼睛的“物体”,然后决定哪只是左眼,哪只是右眼,但现在我认为这不是一个好的解决方案。
最后,我决定尝试同时在面部 (haarcascade_frontalface_default.xml) 中搜索双眼(对 - haarcascade_mcs_eyepair_big.xml opencv 文件),我发现它很多更好的解决方案。它更快,更简单(您不必决定要查找的对象是哪个对象 - 如果您尝试改变眼睛以前的位置和其他一些东西,它可能会非常复杂)并且更容易实现。
精度对我来说已经足够好了,速度也相当快(整个系统 - 大约 10-25fps - 这取决于几件事)。如果您想使用您的代码进行实时眼睛检测,我可以为您提供更多有关优化的详细信息。

关于opencv - 面部内眼部检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15737115/

相关文章:

python - cv2.VideoWriter 在 Jetson Nano 上运行不佳

OpenCV GPU FaceDetector 示例在随机帧上崩溃

c++ - 在QML VideoOutput中将cv::Mat显示为QVideoFrame

c++ - OpenCV copyTo断言错误

android - 如何使用android人脸检测来检测左右眼坐标

Android opencv眼睛检测

c - 某些帧的 OpenCV 眼动追踪松动

python - 在 Python 中使用 OpenCv 转换颜色空间

javascript - 使用 javascript 和 html5 进行眼睛检测

android - 来自移动视觉 API 的 getIsLeftEyeOpen 概率给出 -1 的值