使用 OpenCV 在 Objective-C++ 中播种和霍夫圆

Seed Growing and Hough Circles in Objective-C++ using OpenCV

我正在使用 Objective-C++ 和 OpenCV 检测图像上的球。 我尝试使用 HoughCircle 变换,但我没有正确检测到球。对我来说,参数似乎不符合函数的描述。 Objective-C++ 与 C++ 有何不同?

这是我的代码和OpenCV函数的描述:

cv::medianBlur(grayMat, grayMat, 17);
std::vector<cv::Vec3f> circles;
cv::HoughCircles(grayMat, circles, CV_HOUGH_GRADIENT,
                 1,     //dp resolution
                 1,     //minDist
                 140.0, //higher threshold
                 120.0, //lower threshold
                 15,    //min radius
                 50);   //max radius

如果参数在我实施时是正确的,我的想法是使用种子生长来获得更好的结果。我不知道如何在 Objective-C++ 和 OpenCV 中实现它。我已经在 C++ 中看到了一些示例,但我不知道如何将其 "translate" 转换为 Objective-C++。

你能看看我的 HoughCircle 参数或给我一个 Objective-C++ 种子生长的例子吗?

非常感谢!

编辑:这是两个示例图像 - 我需要通用参数来检测两张图片上的球:

Example image 1

Example image 2

您可以在 Objective C++ 项目中使用 OpenCV 的 C++ API,无需更改。

我试过你的代码并稍微编辑了参数。以下参数将检测所有圆圈:

cvtColor(img, gray, COLOR_BGR2GRAY);
medianBlur(gray, gray, 13);
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, 1,
                 gray.rows/16, 
                 100, 30, 15, 250
                 );

尝试此代码后您会注意到三件事:

  1. 增加中值滤波器大小删除了第二张图片中的假圆圈。
  2. 更改要检测的圆圈的大小范围导致检测到图像 1 中的所有圆圈。
  3. 现在检测到图像二中的圆圈,但大小非常不准确。对于这两张图片,我建议使用 post-processing(种子生长,如你所说?)来检测所有正确的像素。

做这样的项目时,最好在开始分析之前将图像调整为固定大小。参数值对于不同的图像分辨率会有所不同,除非你找到一种方法来标准化它们。