瞳孔阈值(眼动追踪)- 使用 C++ 的 OpenCV

Posted

技术标签:

【中文标题】瞳孔阈值(眼动追踪)- 使用 C++ 的 OpenCV【英文标题】:Thresholding for Pupil (Eye Tracking) - OpenCV with C++ 【发布时间】:2017-06-05 06:40:24 【问题描述】:

我刚刚开始研究瞳孔跟踪。我对瞳孔做了一些阈值处理,但仍然没有需要的准确。下面是我当前的阈值图像

当前阈值图像

我希望只看到轮廓中的瞳孔,但不幸的是我也看到了其他噪音。下面是我的代码

int main( int argc, char** argv )
 
     Mat src, src_gray, src_bw_glint, src_bw_iris, dst, dsti;
     int threshold_value1 = 130;
     int threshold_value2 = 30;
     int const max_BINARY_value = 255;
     VideoCapture cap(1); // open the default camera
     if(!cap.isOpened())  // check if we succeeded
         return -1;
     Mat frame;
     vector<vector<Point> > contours;
     vector<Vec4i> hierarchy;

     int p = 0;

     for(;;)
     

        cap >> src; // get a new frame from camera

        /// Convert it to gray
        cvtColor( src, src_gray, CV_BGR2GRAY );

        Mat drawing = Mat::zeros( src_gray.size(), CV_8UC3 );

        /// Reduce the noise so we avoid false circle detection
        GaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );
        namedWindow( " Demo_Gray", CV_WINDOW_AUTOSIZE );
        imshow( " Demo_Gray", src_gray );

        //Threshold
        threshold( src_gray, src_bw_iris, threshold_value2, max_BINARY_value, 1);

        int morph_size = 5;
        Mat element = getStructuringElement( MORPH_ELLIPSE, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size,morph_size ) );
        cout<<element;

        morphologyEx( src_bw_iris, dst, MORPH_DILATE, element,Point(-1,-1), 1);
        //imshow("Open Image", dst);
        morphologyEx( dst, dsti, MORPH_TOPHAT, element,Point(-1,-1), 10 );
        //imshow("TopHAt Image", dsti);
        morphologyEx( dsti, dsti, MORPH_DILATE, element,Point(-1,-1), 1);
        imshow("TopHAt Image", dsti);

        findContours( dsti, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

        for( int i = 0; i< contours.size(); i++ )
                     
            //Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
            Scalar color = Scalar(p, 255, p);

            drawContours( drawing, contours,i, color, 2, 8, hierarchy, 0, Point() );
            // circle( drawing, mc[i], 4, color1, -1, 8, 0 );                
            imshow("Drawing", drawing);                
        

        if (waitKey(1) == 'q') 
            break;
        

    
    return 0; 

我想知道我的工作的最佳阈值方法,以便仅跟踪学生。另外,请告诉我,如果您认为这可以比我做的简单得多。

【问题讨论】:

尝试找出每个对象的属性,只留下与磁盘最相似的那些(例如set_pixel_area/bounding_box_area比率应该接近PI/4 降低你的门槛。瞳孔比 130 暗得多。或者:pdfs.semanticscholar.org/3260/… 降低你的门槛,尝试使用 HoughCircles CodeProject 上的article 详细解释了一个用 C# 编写的类似项目。他们的算法方法可以很容易地用 OpenCV 编写。本质上,反转图像的颜色,对结果进行灰度化,使用具有更激进阈值(如 220)的二元滤镜。此时,您实际上已经隔离了瞳孔,您只需识别剩余场景中最大的斑点。找到那个斑点,然后从原始照片中裁剪出来,你就得到了你的彩色瞳孔! 【参考方案1】:

我建议使用中值滤波器进行预处理

您的图片没有任何过滤器:

并且您的图像使用中值过滤器处理:

【讨论】:

【参考方案2】:

我认为阈值处理不会改善您的结果。

我会这样做:

    在您的二进制结果中,应用一个带有大圆形结构元素的开口。所有的小图案都会被抹去,只有大的(或多或少)圆形会保留下来。 提取形状指标,主要是圆形指标(参见@​​987654321@)。 更圆的图案将是瞳孔。

【讨论】:

以上是关于瞳孔阈值(眼动追踪)- 使用 C++ 的 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

是否可以访问 hololens 2 上的瞳孔直径等眼动追踪数据?

需要眼动追踪,注视追踪方法

affdex SDK 可以用于眼动追踪吗? [关闭]

Pupil Labs 眼动追踪摄像头已设置,我的视频输入是不是倒置?

Javascript 中的多重凝视检测(眼动追踪)

网站运营中5个源于眼动追踪的启发