我正在使用HoughCircles实时检测球,但是在我的灰度图像流上运行Canny并不能创建所有的边缘。为了解决这个问题,我将rgb图像分成单独的 channel ,在每个 channel 上执行Canny,然后使用按位或将边缘合并在一起。这工作得很好,但是如果我将边缘图像馈送到HoughCircles,它将在边缘图像上再次执行Canny。有什么方法可以防止这种情况,或者放弃我仍在捕捉所有优势的同时执行的rgb split Canny检测?

最佳答案

的确! 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行完成。

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

  • Writing robust (color and size invariant) circle detection with OpenCV (based on Hough Transform or other features)
  • 关于c++ - OpenCV:防止HoughCircles方法使用Canny检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20182439/

    10-11 09:33