我正在使用OpenCV在二进制图像中检测椭圆,如下所示。在图像中,有八个椭圆需要被检测出来。我可以使用findContours获取许多轮廓,包括这八个椭圆。问题是:如何判断哪一个是椭圆,哪一个不是?如何去除所有其他的错误检测?
cv::HoughCircles()
的参数为:/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, 10, 40, 30, 0, 0 );
输出:
但是我喜欢 @George 的想法,跟随它,比指定硬编码常量更加强大。我的方法对于这张图片非常有效,但如果你有不同尺寸的圆形和其他图像,则应使用cv::minEnclosingCircle()
。
一种可行的方法有些hacky:在findContours上方使用minEnclosingCircle,并根据阈值过滤最小包围半径的轮廓(删除小于半径A的轮廓(删除微小斑点)和大于半径B的轮廓(删除巨大斑点))。您还可以尝试minAreaRect并检查宽度/高度比以寻找均匀斑点而不是高/宽斑点。
更少hacky的解决方案是使用霍夫变换。请查看hough circle和教程。
虽然之前已经有另一个答案被接受,但还有几个选项需要探索,所以我会添加另一个答案。假设Hough方法对您的应用程序足够快,这里有一些有趣的替代方案:
我还想补充的是,Hough算法可能是可靠检测椭圆的“正确”方法,但您可能会遇到额外的挑战。您表明Hough圆在您的台式机上足够快,但是台式机的性能如何与嵌入式系统匹配?嵌入式系统是否具有浮点单元?如果没有,不要对软件模拟浮点所展示的性能过于担心。您仍然可以使用定点数学、查找表等方式满意地实现Hough算法。