圈检测问题

时间:2018-03-17 22:54:15

标签: c++ algorithm opencv geometry objective-c++

1. 一些信息:我想在openCV的帮助下开发一种圈识别。我成功地在 Swift objc-c ++ 之间建立了连接,但奇怪的是我的圆识别算法存在一些问题:我的图像中并非所有圆圈都有被检测到了!

2. 查看我的代码:

+(UIImage *)ConvertImage:(UIImage *)image {
    cv::Mat matImage;
    UIImageToMat(image, matImage);

    cv::Mat modImage;
    cv::medianBlur(matImage, matImage, 5);
    cv::cvtColor(matImage, modImage, CV_RGB2GRAY);

    cv::GaussianBlur(modImage, modImage, cv::Size(9, 9), 2, 2);

    vector<Vec3f> circles;
    cv::HoughCircles(modImage, circles, CV_HOUGH_GRADIENT, 1, 1, 100, 50, 0, 0);
    for (auto i = circles.begin(); i != circles.end(); ++i)
        std::cout << *i << ' ';

    for( size_t i = 0; i < circles.size(); i++ )
    {
        cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle( matImage, center, 3, Scalar(0,255,0), -1, 8, 0 );
        circle( matImage, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }

    UIImage *binImg = MatToUIImage(matImage);
    return binImg;
}

img

  

正如您在图片[click]中看到的那样,出现此问题:   只检测到7个圈中的3个!

所以在docs我找到了这一行的参数说明:

cv::HoughCircles(modImage, circles, CV_HOUGH_GRADIENT, 1, 1, 100, 50, 0, 0);
  • dp = 1:分辨率的反比。
  • min_dist = modImage.rows / 8:检测到的中心之间的最小距离。
  • param_1 = 200:内部Canny边缘检测器的上限阈值。
  • param_2 = 100 *:中心检测的阈值。
  • min_radius = 0:要检测的最小无线电。如果未知,则默认为零。
  • max_radius = 0:要检测的最大半径。如果未知,则默认为零。

3. 我的问题

  

如何摆脱上述问题?

任何帮助都将非常感谢:)

2 个答案:

答案 0 :(得分:0)

问题2:轮廓应该是彩色的,而不是白色! 它应该是什么颜色的?无论如何,您可以使用此行在代码中绘制该圆圈。

    circle( matImage, center, radius, Scalar(0,0,255), 3, 8, 0 );

如果要更改颜色,可以更改标量(0,0,255)中声明的值。

如果你根本不想要那个圆圈,你可以删除那行代码。

答案 1 :(得分:0)

您的图片似乎没有噪音。如果图像始终包含圆圈,您可以使用最小二乘法提取轮廓并拟合圆圈

您可以获得圆拟合方程here。这是一个简单的实现。为圆形参数(中心和半径)创建一个结构,拟合圆形并将参数存储在结构中,并使用它来使用OpenCV绘制圆形。

您还可以使用“ellipse2poly”函数在圆上生成点。