我正在使用 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()
的包装器,它在 opencv-2.4.7/modules/imgproc/src 中实现/hough.cpp
第 1006 行之后。
看看这个函数(第 1006 行),注意第 1064 行对 icvHoughCirclesGradient()
的调用。这是负责调用 cvCanny()
的函数,这是在第 817 行完成的。
另一种方法,if the ball is single-colored , 可以通过使用 cv::inRange()
来实现 isolate a specific color ,这将提供更快的检测。此外,该主题已在该论坛上进行了广泛讨论。一个非常有趣的话题是:
关于c++ - OpenCV:防止 HoughCircles 方法使用 Canny 检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182439/