在OpenCV中比较图像边缘和边距

时间:2014-09-24 06:58:49

标签: c++ opencv matching contour edge

我有两个几乎相似的图像,区别在于第二张图像中的形状有点不同。大多数时候较小,但可以更大。此外,一个图像中的形状计数可以在约10到> 100的范围内并且可以彼此相对接近。 它看起来像这样(注意:两个图像都不透明):

Image 1

黑色三角形是图像1,灰色三角形是图像2。

现在我想在图像1的边缘添加一个预定义的边距(此处为3px - 到轮廓的两侧),并测试第二个图像的边缘是否与第一个图像处于“相同”的范围内。如果没有,请直观地显示:

enter image description here

左上角:两个图像之间的差异很小(用红色轮廓显示)

右下:“相同”边缘 - >没有区别

我怎样才能做到最好?

我正在使用OpenCV和C ++

1 个答案:

答案 0 :(得分:2)

如果两个图像中的形状位于相同的位置,并且您只需要图像上的标记而无需其他信息,那么这个简单的技巧就可以做到。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    Mat img1 = imread("D:/1.png");
    Mat img2 = imread("D:/2.png");
    Mat diff;
    absdiff(img1, img2, diff);
    cv::threshold(diff, diff, 128, 255, THRESH_BINARY);
    Mat markers;
    int minRadiusDiff = 2;
    erode(diff, markers, Mat(), cv::Point(-1, -1), minRadiusDiff / 2);
    imwrite("D:/out.png", markers);
}

以下是一些示例图片:

enter image description here

三角形变得更大,摇摆的东西变得更小,四边形略微缩小。

enter image description here

所以我们想要标记三角形和摆动,但不是四边形。

enter image description here

这正是我们的结果。