OpenCV:阻止HoughCircles方法使用Canny Detection

问题描述 投票:7回答:2

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

c++ opencv edge-detection object-detection hough-transform
2个回答
10
投票

确实! 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来实现,这将提供更快的检测。此外,该论坛已在该论坛上进行了广泛讨论。一个非常有趣的主题是:


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))

© www.soinside.com 2019 - 2024. All rights reserved.