使用HoughCircles检测和测量瞳孔和虹膜

我试图使用OpenCV,更具体地说,它的HoughCircles来检测和测量瞳孔和虹膜,目前我一直在玩一些variables的函数,因为它要么返回0圈,要么过量。 下面是我正在使用的代码和testing图像。

虹膜测量代码:

eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; cv::cvtColor(eye1, eye1, CV_RGBA2RGB); cv::bilateralFilter(eye1, eye2, 75, 100, 100); cv::vector<cv::Vec3f> circles; cv::cvtColor(eye2, eye1, CV_RGBA2GRAY); cv::morphologyEx(eye1, eye1, 4, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3, 3))); cv::threshold(eye1, eye1, 0, 255, cv::THRESH_OTSU); eye1 = [self circleCutOut:eye1 Size:50]; cv::GaussianBlur(eye1, eye1, cv::Size(7, 7), 0); cv::HoughCircles(eye1, circles, CV_HOUGH_GRADIENT, 2, eye1.rows/4); 

测量瞳孔的代码:

 eye1 = [self increaseBlackPupil:eye1]; cv::Mat eye2 = cv::Mat::zeros(eye1.rows, eye1.cols, CV_8UC3); eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; cv::cvtColor(eye1, eye1, CV_RGBA2RGB); cv::bilateralFilter(eye1, eye2, 75, 100, 100); cv::threshold(eye2, eye1, 25, 255, CV_THRESH_BINARY); cv::SimpleBlobDetector::Params params; params.minDistBetweenBlobs = 75.0f; params.filterByInertia = false; params.filterByConvexity = false; params.filterByCircularity = false; params.filterByArea = true; params.minArea = 50; params.maxArea = 500; cv::Ptr<cv::FeatureDetector> blob_detector = new cv::SimpleBlobDetector(params); blob_detector->create("SimpleBlob"); cv::vector<cv::KeyPoint> keypoints; blob_detector->detect(eye1, keypoints); 

在这里输入图像说明

我知道图像很粗糙,我一直在试图find一种方法来清理它,使边缘更清晰。

所以我的问题明白地说:我可以做些什么来调整函数HoughCircles中的参数或更改图像,使虹膜和瞳孔检测?

谢谢

好的,没有太多的实验,我所理解的是,在使用霍夫圆检测器之前,你只对图像应用双边滤波器。

在我看来,你需要在这个过程中join一个阈值的步骤。

我把你在post中提供的示例图像做了以下步骤:

  1. 转换为灰度

  2. 形态梯度

  3. 阈值

  4. 霍夫圈检测。

在阈值步骤之后,我只得到了左眼的以下图像:

阈值的图像

这是代码:

灰阶:

  cvCvtColor(im_rgb,im_rgb,CV_RGB2GRAY); 

形态学:

  cv::morphologyEx(im_rgb,im_rgb,4,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(size,size))); 

阈值:

  cv::threshold(im_rgb, im_rgb, low, high, cv::THRESH_OTSU); 

ough circle检测:

  cv::vector<cv::Vec3f> circles; cv::HoughCircles(im_rgb, circles, CV_HOUGH_GRADIENT, 2, im_rgb.rows/4); 

现在当我打印时:

  NSLog(@"Found %ld cirlces", circles.size()); 

我得到:

  "Found 1 cirlces" 

希望这可以帮助。