在OpenCV中检测曲线

Detecting curves in OpenCV

本文关键字:曲线 检测 OpenCV      更新时间:2023-10-16

我刚刚开始使用OpenCV来检测图像中的特定曲线。首先,我想验证是否有曲线,然后,我想根据垂直或水平的凸或凹曲线来识别曲线的类型。是否有一个可用的功能在OpenCV?如果没有,你能给我一些想法,我怎么可能写出这样一个函数?谢谢!顺便说一下,我用的是c++。

模板匹配并不是解决这个问题的可靠方法(就像从一个小针孔看一个物体),边缘检测器不一定会返回图像中的真实边缘;虚假的边缘,如那些由于阴影也返回。此外,你必须处理不完整的边缘问题和其他问题,这些问题随着图像中场景的复杂性而扩大。

总的来说,你提出的问题是一个非常具有挑战性的问题,除了一些有趣的例子,没有好的解决方案。

一个粗略的尝试可以是首先尝试使用边缘检测器(例如建议的精明边缘检测器)检测可信的边缘。接下来,使用RANSAC尝试将检测到的边缘中的点子集拟合到曲线模型中。

例如,假设你正在尝试检测以下形式的曲线f(x) = ax^2 + bx + c。RANSAC基本上会尝试从检测到的边缘中的点中找到最适合该曲线模型的子集。为了检测不同的曲线,相应地改变f(x),并对每条曲线运行RANSAC。然后,您可以尝试确定由f(x)表示的曲线是否真的存在于您的图像中,使用一些启发式应用于RANSAC分配给它的点(例如,如果模型中拟合的点太少,则可能不存在曲线)。但是如何确定一个好的积分阈值呢?当您必须考虑允许的转换(如旋转等)时,您的模型将变得更加复杂。

这种方法的问题是,你基本上是在尝试将你认为应该在图像中的点匹配到点上,有时,即使你正在寻找的东西不在那里,它也会返回给你"最佳可能"的匹配。例如,你从一个同心圆上检测到一大堆点。如果您尝试从这些点检测直线,RANSAC将返回您最佳拟合线!事实上,根据它在随机初始化阶段选择的点,它可以在不同的运行中为您提供许多不同的行。

关于如何在这类问题上使用RANSAC的更多细节,请参阅Marco Zuliani的RANSAC For Dummies。他还有一个很好的MATLAB工具箱来配合这个技术报告,您可以将其移植到您选择的语言。

除非你知道你的背景看起来像什么,或者如果你在控制它,例如,通过强制一个干净的背景,这是一个非常难以解决的问题。