微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么cv.matchShape并不像翻译所要求的那样不变?

如何解决为什么cv.matchShape并不像翻译所要求的那样不变?

我有两个轮廓要匹配(可以将它们视为任意2D闭合曲线)。 opencv声称具有matchShapes函数,该函数在平移,旋转和缩放下不变。但是在我看来,情况并非如此,当我将shift (10,5)添加到其中一条曲线上时,该函数将返回不同的结果,更不用说我做得更怪异了。为什么呢?

matchShape

可复制的示例:

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),0))

解决方法

您发送给cv.matchShapes()的对象必须是contour对象,这些对象与直线2D numpy数组不同。以下代码将曲线转换为图形,

enter image description here

然后显示图像并找到2条曲线的轮廓。

enter image description here

最后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],parameter=0))

cv.namedWindow("xy")
cv.drawContours(xy_img,contours,-1,(0,0),3)
cv.imshow("xy",xy_img)

cv.waitKey()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。