OpenCV:阻止HoughCircles方法使用Canny Detection

时间:2013-11-24 23:25:23

标签: c++ opencv edge-detection object-detection hough-transform

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

2 个答案:

答案 0 :(得分:10)

<强>的确! Canny由HoughCircles内部执行,无法调用cv::HoughCircles()并阻止它调用Canny。

但是,如果您想坚持使用当前的方法,可以选择复制OpenCV源代码中可用的cv::HoughCircles()实现,并根据您的需要进行修改。这样您就可以编写自己的cv::HoughCircles()版本。

如果您遵循此路径,则必须认识到OpenCV的C ++ API是基于C API构建的。这意味着cv::HoughCircles()只是cvHoughCircles()的包装,它在第100行之后的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来实现,这样可以提供更快的检测速度。此外,该论坛已在该论坛上进行了广泛讨论。一个非常有趣的主题是:

答案 1 :(得分:0)

对于希望在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))