2013-03-07 66 views
0

我需要检测使用了opencv2中可用的HoughCircle函数的眼睛图片的虹膜。所以,在opencv for irc中使用hough circle函数查找分钟圆圈

// Read the image 
     src = imread("D:/001R_3.png"); 
     if(!src.data) 
     { return -1; } 

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

     /// Reduce the noise so we avoid false circle detection 
     GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2); 

     ///////////// 
     /// Generate grad_x and grad_y 
     Mat grad_x, grad_y; 
     Mat abs_grad_x, abs_grad_y; 

     Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT); 
     convertScaleAbs(grad_x, abs_grad_x); 

    /// Gradient Y 
     //Scharr(src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT); 
     Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT); 
     convertScaleAbs(grad_y, abs_grad_y); 

    /// Total Gradient (approximate) 
     addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad); 
     /////////////// 
     vector<Vec3f> circles; 

     /// Apply the Hough Transform to find the circles 
     HoughCircles(grad, circles, CV_HOUGH_GRADIENT, 1, grad.rows/8, 200, 100,0,0); 

     /// Draw the circles detected 
      for(size_t i = 0; i < circles.size(); i++) 
       { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
      cout<<center; 
      int radius = cvRound(circles[i][2]); 
      // circle center 
      cout<<radius; 
      circle(src, center, 3, Scalar(0,255,0), -1, 8, 0); 
      // circle outline 
      circle(src, center, radius, Scalar(0,0,255), 3, 8, 0); 
      } 

      /// Show your results 
      namedWindow("Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE); 
      imshow("Hough Circle Transform Demo",src); 
       } 

因此,这里是我的代码,只检测眼睛的外侧部分,其中,因为我想瞳孔和虹膜边界进行检测和那没有发生,我提到的链接OpenCV: Using Hough Circle Transformation to detect iris 但不这样工作。而不是canny边缘检测器使用sobel。建议请。

回答

1

霍夫变换的第五个参数是圆圈之间的minDist或最小距离(以像素为单位)。您将此参数设置为图像中的行数除以8,这意味着任何重叠的圆圈(例如眼睛的瞳孔和虹膜)都不会因为它们太靠近而被返回。

我会把这个数字设置为一个变量而不是硬编码它,并尝试一组更小的数字,直到找到有效的东西。