2011-11-24 221 views
5

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

+0

你在处理什么样的图像?他们有什么背景?如果可能的话,附上一些图片的照片。 – maximus

回答

6

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

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

粗略的尝试可能是首先尝试使用边缘检测器(例如建议的Canny边缘检测器)来检测似乎合理的10边缘。接下来,使用RANSAC尝试将检测到的边缘中的点的子集合到曲线模型中。

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

这种方法的问题在于你基本上试图将你认为应该在图像中应该在点上,甚至有时你所寻找的东西不存在,它会让你回到“最佳”状态。对于例如你有一大堆从同心圆检测到的点。如果您尝试从这些点检测直线,RANSAC会为您返回最合适的线条!事实上,根据它在随机初始化阶段选择的点,它可以为您提供来自不同运行的许多不同行。

有关如何在这类问题上使用RANSAC的更多详细信息,请参阅RANSAC for Dummies作者:Marco Zuliani。他还有一个很好的MATLAB toolbox陪伴这个技术报告,你可以移植到你选择的语言。除非你知道你的背景是什么样的,或者你是在控制它,例如,通过强制干净的背景,这是一个非常难以解决的问题。