HoughCircles提供错误的圈数和位置 - iOS

时间:2013-05-23 16:16:37

标签: iphone ios opencv image-processing uiimage

我使用OpenCV来帮助我检测从iPhone相机拍摄的图像中的硬币。我使用HoughCircles方法来帮助我找到它们,但结果并不乐观。

cv::Mat greyMat;
    cv::Mat filteredMat;
    cv::vector<cv::Vec3f> circles;
    cv::cvtColor(mainImageCV, greyMat, CV_BGR2GRAY);

    cv::threshold(greyMat, filteredMat, 100, 255, CV_THRESH_BINARY);

    for ( int i = 1; i < 31; i = i + 2 )
    {
//        cv::blur( filteredMat, greyMat, cv::Size( i, i ), cv::Point(-1,-1) );
        cv::GaussianBlur(filteredMat, greyMat, cv::Size(i,i), 0);
//        cv::medianBlur(filteredMat, greyMat, i);
//        cv::bilateralFilter(filteredMat, greyMat, i, i*2, i/2);
    }

    cv::HoughCircles(greyMat, circles, CV_HOUGH_GRADIENT, 1, 50);

    NSLog(@"Circles: %ld", circles.size());

    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]);
        cv::circle(greyMat, center, 3, cv::Scalar(0,255,0));
        cv::circle(greyMat, center, radius, cv::Scalar(0,0,255));
    }

    [self removeOverViews];
    [self.imageView setImage: [self UIImageFromCVMat:greyMat]];

这个当前的代码段返回我有15个圆圈,并且它们都是图像右侧的所有位置让我感到困惑。

image with the "circles" drawn over

我是OpenCV的新手,几乎没有iOS的例子让我感到绝望。

非常感谢任何帮助,提前谢谢!

3 个答案:

答案 0 :(得分:2)

你的算法没有多大意义。看起来你正在迭代地使用cv :: GaussianBlur,但是当你在它上面运行HoughCircles时,它只能用于由带有31x31内核的GassianBlur过滤的灰色图像,这将模糊出来的垃圾。图片。做这样的事情以获得最佳结果可能更有意义:

这会迭代地显示所有图像,我相信这是你想要做的第一个。

// NOTE only psuedocode, won't compile, need to fix up.
for ( int i = 1; i < 31; i = i + 2 )
{
    cv::GaussianBlur(filteredMat, greyMat, cv::Size(i,i), 0);
    cv::HoughCircles(greyMat, circles, CV_HOUGH_GRADIENT, 1, 50);

    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]);
        cv::circle(greyMat, center, 3, cv::Scalar(0,255,0));
        cv::circle(greyMat, center, radius, cv::Scalar(0,0,255));
    }
    cv::imshow("Circles i " + i, greyMat);
}

您还需要一些边缘才能使HoughCircle实现正常工作。它使用Canny边缘检测器,如果你模糊你的图像那么多。

另外我建议你使用bluF的双边过滤器,但试图保持一些边缘。

这可能有助于定义正确的参数:HoughCircles Parameters to recognise balls

答案 1 :(得分:0)

以上所有代码都会反复运行相同的过程,因此您的圈子会一遍又一遍地检测绘制的圈子。不是最好的。在我看来,一遍又一遍地使用高斯模糊,而不是最好的方式。我可以在for循环中看到高斯模糊以使图像更具可读性,但在for循环中不能看到HoughCircles。你需要在houghcircles中包含所有变量,当我全部使用它时,它的识别率会翻倍。

cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 30, 50, 20, 10, 25);

在opencv网站上可用的格式与C ++格式相同。

这是我的iPhone sim照片的链接。 Costco阿司匹林在我的桌面上。应用会计算图像中的圆圈并以标签显示总数。

enter image description here

这是我的代码,它包含了很多评论,以显示我尝试过的内容并进行了筛选。希望这可以帮助。 OpenCV install in xcode

答案 2 :(得分:0)

我知道这是一个老问题,所以只要把它放在这里,以防其他人犯同样的错误(就像我......):

这一行:

cv::Point center((cvRound(circles[i][0]), cvRound(circles[i][1])));

括号乱了,双&#34;((&#34;在开头导致点只用一个参数而不是两个参数初始化,它应该是:

cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));

希望有所帮助。