我使用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个圆圈,并且都位于图像右侧,这让我感到困惑。

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

任何帮助将不胜感激,在此先感谢!

最佳答案

您的算法没有多大意义。看来您正在迭代地使用cv::GaussianBlur,但是当您在其上运行HoughCircles时,它只会在由GassianBlur过滤并具有31x31内核的灰度图像上工作,这将使废话变得模糊图片。做这样的事情来获得最佳效果可能更有意义:

这将迭代地显示所有图像,我相信这是您首先要做的。

// 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边缘检测器,如果图像模糊太多。

我也建议您使用bilateralFilter,它模糊但尝试保留一些边缘。

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

10-04 13:57