OpenCV:防止 HoughCircles 方法使用 Canny 检测

Posted

技术标签:

【中文标题】OpenCV:防止 HoughCircles 方法使用 Canny 检测【英文标题】:OpenCV: Prevent HoughCircles method from using Canny Detection 【发布时间】:2013-12-09 13:14:07 【问题描述】:

我正在使用 HoughCircles 实时检测球,但在我的灰度图像流上运行 Canny 并没有按应有的方式创建所有边缘。为了解决这个问题,我将 rgb 图像拆分为单独的通道,对每个通道执行 Canny,然后使用按位或将边缘合并在一起。这工作得很好,但如果我将该边缘图像提供给 HoughCircles,它将再次对边缘图像执行 Canny。有没有办法防止这种情况发生,或者放弃我正在执行的 rgb split Canny 检测,同时仍然捕捉所有边缘?

【问题讨论】:

【参考方案1】:

确实! Canny 由HoughCircles 在内部执行,无法调用cv::HoughCircles() 并阻止它调用Canny。

但是,如果您想坚持当前的方法,另一种方法是复制 OpenCV 源代码中提供的 cv::HoughCircles() 的实现,并对其进行修改以满足您的需要。这将允许您编写自己的cv::HoughCircles() 版本。

如果您遵循这条路径,重要的是要意识到 OpenCV 的 C++ API 是基于 C API 构建的。这意味着cv::HoughCircles() 只是cvHoughCircles() 的一个包装器,它在第1006 行之后的opencv-2.4.7/modules/imgproc/src/hough.cpp 处实现。

查看这个函数(第 1006 行)并注意在第 1064 行对 icvHoughCirclesGradient() 的调用。这是负责调用 cvCanny() 的函数,该函数在第 817 行完成。

另一种方法if the ball is single-colored 可以通过使用cv::inRange() 到isolate a specific color 来实现,这将提供更快的检测速度。此外,该主题已在此论坛上进行了广泛讨论。一个非常有趣的话题是:

Writing robust (color and size invariant) circle detection with OpenCV (based on Hough Transform or other features)

【讨论】:

OpenCV 内部的 HoughCircles 方法确实在内部执行 Canny。 docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/… 我希望能够关闭它。我要找的球不是单一颜色的,我们也不提前知道球。我已经阅读过您之前提到的问题,但它并没有回答我在这里提出的问题。 谢谢,这就是我正在考虑做的事情,但希望有办法解决它。您是否知道任何其他更简单的 Hough Circles 开源实现,我可以调整它的工作方式?我想对实现进行一些调整以加快速度。 顺便说一句,here's an interesting Java implementation。如果它对您有帮助或选择它作为官方问题解决者,请随时对我的回答进行投票。通过这样做,您可以帮助未来的访问者。【参考方案2】:

对于希望在 Python 中使用自定义边缘检测和圆形检测的人,您可以使用 OpenCV 的 Canny 边缘检测函数并将其传递给 scikit-image 的 (skimage) hough_circle 函数 (http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.hough_circle)。

Skimage 的 hough_circle 函数不会在内部执行 Canny 边缘检测,因此您有机会实现自己的。下面是一个例子:

hough_results = hough_circle(cv2.Canny(IMAGE, LOWER_THRESHOLD, UPPER_THRESHOLD), np.arrange(MIN_RADIUS, MAX_RADIUS,1))

【讨论】:

以上是关于OpenCV:防止 HoughCircles 方法使用 Canny 检测的主要内容,如果未能解决你的问题,请参考以下文章

#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

HoughCircles 在 OpenCV 中无法正确检测圆

OpenCV 中用于虹膜检测的 HoughCircles 的正确用法/参数值是啥?

opencv中的HoughCircles函数可以检测圆圈内的圆圈吗?

Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()

使用opencv和python进行HoughCircles圆检测-