霍夫圆变换参数识别球

6

在将一张图片转换为灰度图并进行模糊处理后,我尝试使用以下参数应用霍夫圆变换:

  • CV_HOUGH_GRADIENT
  • dp = 1
  • min_dist = 1
  • param_1 = 70
  • param_2 = 100
  • min_radius = 0
  • max_radius = 0

这是其中一张我尝试过的多张图片之一: http://i.stack.imgur.com/JGRiM.jpg

但即使放宽参数,算法也无法识别出球。

(当我尝试使用GIMP中创建的一个圆的图像时,它可以正常工作)

2个回答

9

我同意krzych的看法。 我轻松地使用以下方法使其工作:

cv::Mat img,img2;
std::vector<cv::Vec3f> circles;
img = cv::imread("JGRiM.jpg",1);
cv::bilateralFilter(img, img2, 15, 1000, 1000);
cv::cvtColor(img2, img2,CV_BGR2GRAY);
cv::HoughCircles(img2, circles, CV_HOUGH_GRADIENT, 1,300,50, 10);
cv::circle(img2,cv::Point(circles[0][0],circles[0][1]),circles[0][2],cv::Scalar(126),2);
cv::imshow("test",img2);

cv::waitKey(0);
cv::imwrite("test.jpg",img2);
return 0;

enter image description here

Good luck :)


你能否详细解释一下你的数字是如何得出的?我正在尝试做类似的事情,想要弄清楚如何计算最适合我的解决方案的最佳数字。谢谢! - jluzwick
4
minDist = 300像素,以便我们只找到一个圆(较小的值会在球周围找到多个圆)。 minRad = 10,以避免计数小圆圈(噪音)。 对于其他参数,我很幸运:)(尽管这张图片非常稳健,不易受到参数调整的影响) - Quentin Geissmann
谢谢!那非常有帮助。双边滤波器怎么样?我一直在尝试找到更通俗易懂的参数解释。对此有什么建议吗? - jluzwick

0

首先检查您的图像的Canny输出。从这个Canny输出中,可以使用非常小的param_2检测到球,以及图像上的许多错误圆形。(例如,我使用了param_2 = 10,并指定了球心来消除错误圆形,它可以工作)

尝试帮助霍夫圆变换。任务是将球从其他元素中分割出来。在您的图像问题中是线条,您可以尝试使用颜色来分割球。


你能进一步解释一下你的方法论吗?(如何提供指定的球心)。如果我有一个大约在图像中央占据60到70%帧的球。我该如何确定最佳参数? - jluzwick
2
你可以使用非常低的param_2检测所有圆形。这将给你很多误判的圆。然后,如果你大概知道中心位置,可以进行排除。简单地迭代所有圆并删除距离指定中心估计距离大于某个阈值的圆。 - krzych
啊,聪明!是的,那确实非常有帮助。 - jluzwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接