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

标签 opencv image-processing matching similarity pattern-recognition

我有两个轮廓要匹配(可以将它们视为任意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), 1, 0))

最佳答案

您发送给cv.matchShapes()的对象必须是与直线2D contour数组不同的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], 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 - 为什么cv.matchShape并不像翻译所要求的那样不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64509434/

相关文章:

python - 使用 Raspberry Pi 3 B 型(和 Pi 相机)进行高速高分辨率图像捕获

python - Opencv houghLines 不检测线

python - Python 中的 Blob (Lee Filter)

将首选合作伙伴分成三组的算法

javascript - Javascript 如何检查两个字符串是否包含相同的字符?

java - ImageView 仅显示循环中的最后一张图像

image-processing - 特征检测和描述符提取有什么区别?

java - 更改原始图像文件的颜色权重

asynchronous - 异步方法中的类型不匹配

opencv - 在 Ubuntu 16.04 上安装 OpenCV 时出错