在OpenCV中检测曲线

5

我刚开始使用OpenCV来检测图像中的特定曲线。首先,我想要验证是否存在曲线,接着,我想根据垂直或水平凸/凹曲线的类型进行识别。在OpenCV中是否有可用函数?如果没有,你能给我一些关于如何编写这样一个函数的想法吗?谢谢!顺便说一句,我正在使用C++。


你处理的是什么类型的图像?它们有什么背景?如果可能,请附上一些图片。 - maximus
1个回答

6
模板匹配不是解决这个问题的可靠方法(就像从小针孔看物体),边缘检测器不一定返回图像中真实的边缘,还会返回由于阴影等原因而产生的虚假边缘。此外,您必须处理不完整边缘和其他随着图像场景复杂度增加而扩大的问题。
总的来说,您提出的问题非常具有挑战性,并且除了玩具示例之外,没有好的解决方案。
一个粗略的尝试可以先使用边缘检测器(例如建议使用Canny边缘检测器)检测出合理的边缘,接下来使用RANSAC来尝试将检测到的边缘中的点子集拟合到您的曲线模型中。
例如,假设您正在尝试检测以下形式的曲线f(x) = ax^2 + bx + c。 RANSAC基本上将尝试从检测到的边缘中找到一个子集,最能适合这个曲线模型的点。要检测不同的曲线,请相应地更改f(x)并针对每个曲线运行RANSAC。然后,您可以尝试使用一些启发式方法来确定由RANSAC分配给它的点是否真正存在于您的图像中表示f(x)的曲线(例如,如果分配给该模型的点太少,则可能不存在曲线。但如何确定点数的良好阈值?)。当您必须考虑允许旋转等变换时,您的模型将变得更加复杂。
这种方法的问题在于,您基本上是尝试将您认为应该出现在图像中的内容与点拟合,有时即使您要查找的内容不存在,它也会返回“最佳可能”的拟合结果。例如,您从同心圆中检测到了大量点。如果您尝试从这些点中检测直线,RANSAC将向您返回最佳拟合线!实际上,它可以根据其随机初始化阶段选择哪些点而在不同运行中给出许多不同的线。

如果想了解如何在这种问题上使用RANSAC,可以查看RANSAC for Dummies by Marco Zuliani。他还有一个不错的MATLAB工具箱可供参考,您可能可以将其移植到所选语言中。

除非您知道背景的外观,或者通过强制清理背景来控制背景,否则这是一个非常难以解决的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接