opencv - 如何比较二值图案图像的两个轮廓?

标签 opencv compare pattern-matching

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

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

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

最佳答案

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

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

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

关于opencv - 如何比较二值图案图像的两个轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10355015/

相关文章:

javascript - 理解 javascript 中的位运算

java - PriorityQueue 的 remove 方法是否重新排列堆?

android - 如何在不同语言的给定文本文件中搜索字符串

linux - 在 Linux 上的多个图像中搜索特定的给定十六进制字符串

python - 查找两个字符串不同的位置

python - 在 opencv 中突出显示所有可能的圆圈(气泡纸选择)

c++ - 多线程opencv视频处理Qt/C++

opencv - cv2.filter2d() opencv 中 ddepth 参数的解释?

.net - 比较图像以发现差异

opencv - DFT 和 FFT(幅度)结果之间的差异