2012-04-27 81 views
2

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

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

你可以在这里查看模板:http://www.cryogendesign.com/partDetection.html

+0

[OpenCV matching images]可能重复(http://stackoverflow.com/questions/8893539/opencv-matching-images) – karlphillip 2012-04-27 18:39:52

+0

或http://stackoverflow.com/questions/9444142/comparing-images-for - 相似性 – karlphillip 2012-04-27 18:40:38

回答

1

如果你准备好做它自己,一个方法可以是计算‘距离图像’(最小欧几里得距离分配每个像素的轮廓作为参考)。见http://en.wikipedia.org/wiki/Distance_transform

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

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

+0

如果这个不清楚,请随时问我更多... – 2012-05-07 10:55:59

0

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

chamfer

TE是一套模板和图像,并x边缘的就是你开始比较的参考点两组边缘。因此,每个x你都会得到不同的价值。

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

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