为什么 cv.matchShapes() 会检测到相同形状之间的巨大差异?

问题描述 投票:0回答:1

我有一个比较两个几何图形的代码。我将比较的阈值设置为 0.1(您将在下面的代码中看到它),原则上结果或多或少都不错。

但有时您会遇到非常相似的图形(但 x 和 y 坐标不同)。例如

enter image description here enter image description here

也就是说,原则上,图形是相似的,但就图纸上的坐标而言,图形的位置略有不同。

 def compare_two_figure(template, figure_for_compare):
    template = cv.imread(template, cv.IMREAD_GRAYSCALE)
    figure_for_compare = cv.imread(figure_for_compare, cv.IMREAD_GRAYSCALE)

    _, thresh_template = cv.threshold(template, 127, 255, 0)
    _, thresh_figure_for_compare = cv.threshold(figure_for_compare, 127, 255, 0)

    contours_template, _ = cv.findContours(thresh_template, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    particular_contour_template = contours_template[1]

    contours_figure_for_compare, _ = cv.findContours(thresh_figure_for_compare, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    particular_contour_figure_for_compare = contours_figure_for_compare[1]

    differences = cv.matchShapes(particular_contour_template, particular_contour_figure_for_compare, 1, 0.0)
    print(differences)
    if differences < 0.1:
        return "same"
    else:
        return "different"


print(compare_two_figure('files/template_14_v2.jpg', 'searching_figure_14.jpg'))

从上面的例子来看,差异=7.842170693643041

如您所知,我希望在这种情况下的结果是数字相同(或几乎相同)。告诉我,这如何实现?

python opencv computer-vision
1个回答
0
投票

参见文档 https://docs.opencv.org/4.x/d5/d45/tutorial_py_contours_more_functions.html

findContours
matchShapes
预计内部为白色 (255),外部为黑色 (0)。

我使用此代码转换了您的图像:

def fill_polygons(template, figure_for_compare):
    template = cv.imread(template, cv.IMREAD_GRAYSCALE)

    template = 255 - template
    figure_for_compare = cv.imread(figure_for_compare, cv.IMREAD_GRAYSCALE)
    figure_for_compare = 255 - figure_for_compare

    _, thresh_template = cv.threshold(template, 127, 255, 0)
    _, thresh_figure_for_compare = cv.threshold(figure_for_compare, 127, 255, 0)

    contours_template, _ = cv.findContours(thresh_template, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    particular_contour_template = contours_template[1]

    cv.fillPoly(thresh_template, pts=[particular_contour_template], color=(255, 255, 255))

    cv.imwrite("/tmp/1a.png", thresh_template)
    contours_template = cv.findContours(thresh_template, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    particular_contour_template = contours_template[1]

    contours_figure_for_compare, _ = cv.findContours(thresh_figure_for_compare, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    particular_contour_figure_for_compare = contours_figure_for_compare[1]

    cv.fillPoly(thresh_figure_for_compare, pts=[particular_contour_figure_for_compare], color=(255, 255, 255))
    cv.imwrite("/tmp/2a.png", thresh_figure_for_compare)


fill_polygons('files/template_14_v2.jpg', 'searching_figure_14.jpg'))

通过你的函数,我得到差异〜= 0.45

(我认为你拥有的两个形状不一样,我的意思是你不只是移动第一个来获得第二个)

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.