如何比较二值模式图像的两个轮廓?

时间:2012-04-27 17:13:44

标签: opencv compare pattern-matching

我正在用C创建一个零件扫描仪,它将扫描零件的所有可能性作为目录中的图像。我的代码当前从该目录中获取所有图像并将它们转储到向量中。然后,我为所有图像生成一组轮廓。然后该程序进入一个while循环,它不断地从网络摄像头抓取图像,并为这些图像生成轮廓。我已经为这个部件设置了一个夹具,因此方向和尺寸不是问题,但我不想校准机器,因此模板图像和拍摄的零件图像之间可能会有移动。

比较轮廓的最佳方法是什么?我已经尝试了几种方法,包括不带轮廓的matchTemplate,但是如果你看一下下面的两个部分,你会发现这两个部分彼此非常接近,所以matchShapes和matchTemplate无法区分我使用它的方式他们。我也不确定如何使用cvMatchShapes。它只是将图像直接加载到匹配形状中,但结果尚无定论。我认为轮廓是要走的路,我只是不确定如何实施比较阶段。任何帮助都会很棒。

您可以在此处查看模板:http://www.cryogendesign.com/partDetection.html

2 个答案:

答案 0 :(得分:1)

如果您已准备好自己动手,一种方法可能是计算“距离图像”(将每个像素分配给作为参考的轮廓的最小欧几里德距离)。请参阅http://en.wikipedia.org/wiki/Distance_transform

使用此距离图像,您可以快速计算新轮廓与参考轮廓的平均距离(对于每个轮廓像素,获取距离图像的距离)。平均距离为您提供适合度的指示,并让您找到与一组参考模板的最佳匹配。

如果零件具有一定的移动自由度,则情况有点困难:在计算平均距离之前,必须将新轮廓拟合到参考零件。您需要应用合适的变换(平移,旋转,可能缩放),并找到最小化...平均距离的参数。

答案 1 :(得分:0)

您可以计算两个轮廓之间的倒角距离:

chamfer

TE是模板和图像的边缘集合,x是您开始比较两组边缘的参考点。因此,对于每个x,您会得到不同的值。

DT是图像的距离变换。 Matlab提供了算法here

如果您想了解如何计算倒角距离的更详细版本,请查看here