为什么 cv.matchShape 不像它声称的那样对平移不变?
Why cv.matchShape is NOT invariant to translation as it claims?
我有两个要匹配的轮廓(将它们想象成任意二维闭合曲线)。 opencv
声称具有 matchShapes
在平移、旋转和缩放下不变的功能。但在我看来情况并非如此,当我将 shift (10, 5)
添加到其中一条曲线时,函数 returns 会产生不同的结果,更不用说如果我做了一些更奇怪的事情。这是为什么?
可重现的例子:
t = np.arange(0, np.pi, 0.001)
x, y = np.cos(t), np.sin(t)
xy = np.stack([x, y], -1)
print(cv.matchShapes(xy, xy, 1, 0))
print(cv.matchShapes(xy, xy + (2, 10), 1, 0))
您发送到 cv.matchShapes()
的对象必须是 contour
不同于直接二维 numpy
数组的对象。以下代码将您的曲线转换为绘图,
然后到一张图片,找到2条曲线的轮廓。
最后cv.matchShapes()
是运行。
输出:0
自匹配 & 6.637412841570267e-12
与翻译曲线的匹配,在翻译下相当准确的匹配。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
t = np.arange(0, np.pi, 0.001)
x, y = np.cos(t), np.sin(t)
ax.plot(x, y)
x_new = x + 2
y_new = y + 10
ax.plot(x_new, y_new, 'b')
[s.set_visible(False) for s in ax.spines.values()]
[t.set_visible(False) for t in ax.get_xticklines()]
[t.set_visible(False) for t in ax.get_yticklines()]
ax.axis('off')
plt.savefig('xy.jpg')
xy_img = cv.imread('xy.jpg', cv.IMREAD_COLOR)
xy_cpy = cv.cvtColor(xy_img, cv.COLOR_BGR2GRAY)
(threshold, bw) = cv.threshold(xy_cpy, 127, 255, cv.THRESH_BINARY)
contours, hier = cv.findContours(bw, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
contours = contours[0:-1] # remove box surounding whole image
print(cv.matchShapes(contours[0], contours[0], method=cv.CONTOURS_MATCH_I1, parameter=0))
print(cv.matchShapes(contours[0], contours[1], method=cv.CONTOURS_MATCH_I1, parameter=0))
cv.namedWindow("xy")
cv.drawContours(xy_img, contours, -1, (0, 255, 0), 3)
cv.imshow("xy", xy_img)
cv.waitKey()
我有两个要匹配的轮廓(将它们想象成任意二维闭合曲线)。 opencv
声称具有 matchShapes
在平移、旋转和缩放下不变的功能。但在我看来情况并非如此,当我将 shift (10, 5)
添加到其中一条曲线时,函数 returns 会产生不同的结果,更不用说如果我做了一些更奇怪的事情。这是为什么?
可重现的例子:
t = np.arange(0, np.pi, 0.001)
x, y = np.cos(t), np.sin(t)
xy = np.stack([x, y], -1)
print(cv.matchShapes(xy, xy, 1, 0))
print(cv.matchShapes(xy, xy + (2, 10), 1, 0))
您发送到 cv.matchShapes()
的对象必须是 contour
不同于直接二维 numpy
数组的对象。以下代码将您的曲线转换为绘图,
然后到一张图片,找到2条曲线的轮廓。
最后cv.matchShapes()
是运行。
输出:0
自匹配 & 6.637412841570267e-12
与翻译曲线的匹配,在翻译下相当准确的匹配。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
t = np.arange(0, np.pi, 0.001)
x, y = np.cos(t), np.sin(t)
ax.plot(x, y)
x_new = x + 2
y_new = y + 10
ax.plot(x_new, y_new, 'b')
[s.set_visible(False) for s in ax.spines.values()]
[t.set_visible(False) for t in ax.get_xticklines()]
[t.set_visible(False) for t in ax.get_yticklines()]
ax.axis('off')
plt.savefig('xy.jpg')
xy_img = cv.imread('xy.jpg', cv.IMREAD_COLOR)
xy_cpy = cv.cvtColor(xy_img, cv.COLOR_BGR2GRAY)
(threshold, bw) = cv.threshold(xy_cpy, 127, 255, cv.THRESH_BINARY)
contours, hier = cv.findContours(bw, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
contours = contours[0:-1] # remove box surounding whole image
print(cv.matchShapes(contours[0], contours[0], method=cv.CONTOURS_MATCH_I1, parameter=0))
print(cv.matchShapes(contours[0], contours[1], method=cv.CONTOURS_MATCH_I1, parameter=0))
cv.namedWindow("xy")
cv.drawContours(xy_img, contours, -1, (0, 255, 0), 3)
cv.imshow("xy", xy_img)
cv.waitKey()