我想使用cvHoughCircles()在图像中查找圆。但我对第四个参数感到困惑,因为当我使用"1"时,cvHoughCircles()找不到圆,而当我使用"2"时,该方法工作正常,可以检测图像中的所有圆。
单击此处查看两种情况下我的程序的屏幕截图。
我在另一个图像上做了同样的操作,但这次将第四个参数的值从1更改为2,并没有影响结果[cvHoughCircles()在两种情况下都返回了相同的结果(对第四个值使用1或2)]。
有人能告诉我在处理不同的图像时,第四个参数应该使用什么值吗?
查看此链接:
http://docs.opencv.org/modules/imgproc/doc/feature_detection.html
它列出了所有函数的c/c++/python实现,说明了每个参数的作用,我一直发现其中一个是javacv所包装的(在本例中是c代码)。当我看到你的帖子时,我实际上正在寻找这个页面,所以如果它再次发生,我现在可以关注我自己的链接了(太棒了!)。现在我尽我所能回答你的问题。
功能如下:
CvSeq* cvHoughCircles(CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0 )
网站描述:
dp–累加器分辨率与图像分辨率的反比。例如,如果dp=1,则累加器具有与输入图像相同的分辨率。如果dp=2,则蓄能器的宽度和高度是蓄能器宽度和高度的一半。
我猜(根据我在课堂上的记忆),这指的是有时用于特征检测的金字塔方案。基本上,你对图像的像素进行平均,以获得较小的图像,从而找到重要特征的位置,如角,或者在这种情况下是圆,这些特征最终基于梯度信息(因此应该使用黑白或灰度图像)。
使用dp=1应该很好,但是,只需确保在图像上调用cvSmooth(),这样梯度向量就可以在圆周围形成一个漂亮的圆。如果您知道有一个圆圈,那么您可以继续平滑和扩张(cvDilate),直到圆圈出现,但随后您可能会检测到伪影,因此最大的圆圈应该是感兴趣的。最后,这取决于你使用算法的情况。