我有一个比较两个几何图形的代码。我将比较的阈值设置为 0.1(您将在下面的代码中看到它),原则上结果或多或少都不错。
但有时您会遇到非常相似的图形(但 x 和 y 坐标不同)。例如
也就是说,原则上,图形是相似的,但就图纸上的坐标而言,图形的位置略有不同。
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
如您所知,我希望在这种情况下的结果是数字相同(或几乎相同)。告诉我,这如何实现?
参见文档 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
(我认为你拥有的两个形状不一样,我的意思是你不只是移动第一个来获得第二个)