瞳孔的阈值处理(眼动追踪) - 带C ++的OpenCV

时间:2017-01-20 10:03:56

标签: python c++ opencv image-processing eye-tracking

我刚刚开始研究瞳孔跟踪。我为学生做了一些阈值处理,但仍然不如所需的准确。以下是我当前的阈值图像

当前阈值图像

img

我最好只看到轮廓中的瞳孔但不幸的是我也看到了其他噪音。以下是我的代码

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; 
}

我想知道我的工作中最好的阈值处理方法,以便只跟踪学生。另外,请让我知道,如果你认为,这可以比我做的更简单。

2 个答案:

答案 0 :(得分:0)

我不认为工作是一个阈值可以改善你的结果。

以下是我要做的事情:

  1. 在二进制结果上,应用一个带有大圆结构元素的开口。所有小图案都将被删除,只留下大的(或多或少)圆形。
  2. 提取形状索引,主要是圆形度指数(参见a list here)。
  3. 圆形图案将是瞳孔。

答案 1 :(得分:0)

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

没有任何过滤器的图片:

your image

并使用中值滤镜处理您的图像:

your image processed with a median filter