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