假设我在图像上发现了轮廓。在图像2上找到此轮廓的位置的最佳方法是什么?
我看到两个选择:要么用白线绘制轮廓并匹配图像2上的图像,要么我以某种方式(甚至有可能吗?)直接匹配图像2上的轮廓。
轮廓中的内容是完全随机的,但是假设我可以模板匹配具有透明度的图像,则图像1的轮廓用白色的1px线绘制将完全匹配。
这是找到的,绘制的和保存的轮廓(图像1)以及需要在其中定位图像1(图像2)的图像的示例图像。 https://imgur.com/a/MNQ6aNr
最好先找到轮廓,而不必先绘制并保存,但是我认为匹配绘制的轮廓会更直接。
谢谢
编辑:
这是我的完整代码。它需要一个full_image和一个片段,它将与完整图像匹配。最后,它导出了一些结果。
full_image = cv2.imread('puzzle_1.jpg')
piece = cv2.imread('piece_1.png', cv2.IMREAD_UNCHANGED)
partial_image = cv2.cvtColor(piece,cv2.COLOR_BGR2GRAY)
contours, hierarchy = cv2.findContours(partial_image.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
template = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(template, contours, -1, (255, 255, 255, 255),1)
hh, ww = template.shape[:2]
puzzleP = template[:,:,0:3]
alpha = template[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])
correlation = cv2.matchTemplate(full_image, puzzleP, cv2.TM_CCORR_NORMED, mask=alpha)
threshhold = 0.98
loc = np.where(correlation >= threshhold)
result = full_image.copy()
for pt in zip(*loc[::-1]):
cv2.rectangle(result, pt, (pt[0]+ww, pt[1]+hh), (0,0,255), 1)
print(pt)
cv2.imwrite('puzzle_piece.png', puzzleP)
cv2.imwrite('full_image_alpha.png', alpha)
cv2.imwrite('full_image_matches.jpg', result)
这是一个很好的结果,但无效的结果 https://imgur.com/a/ZYyw7tU
任何改进技巧都将不胜感激!
答案 0 :(得分:1)
您可以在Python / OpenCV中将matchTemplate与遮罩图像一起使用,以忽略模板的区域。因此,如果您有透明的模板,请提取alpha通道并将其用作模板,使用模板BGR通道作为matchTemplate中的模板图像。见
https://docs.opencv.org/4.1.1/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be