import cv2
import matplotlib.pyplot as plt
import numpy as np
img_1 = cv2.imread('right.png')
https://pasteboard.co/J5cdLV0.png
img_2 = cv2.imread('left.png')
https://pasteboard.co/J5cdrBK.png
img1 = cv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img_2,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
good = []
for m in matches:
if (m[0].distance < 0.5*m[1].distance):
good.append(m)
matches = np.asarray(good)
if (len(matches[:,0]) >= 4):
src = np.float32([ kp1[m.queryIdx].pt for m in matches[:,0] ]).reshape(-1,1,2)
dst = np.float32([ kp2[m.trainIdx].pt for m in matches[:,0] ]).reshape(-1,1,2)
H, masked = cv2.findHomography(src, dst, cv2.RANSAC, 5.0)
else:
raise AssertionError('Can’t find enough keypoints.')
dst = cv2.warpPerspective(img_1,H,((img_1.shape[1] + img_2.shape[1]), img_1.shape[0]+img_2.shape[0])) #wraped image
dst[0:img_2.shape[0], 0:img_2.shape[1]] = img_2 #stitched image
cv2.imwrite('result.png',dst)
plt.imshow(dst)
plt.show()
Результат: https://imgur.com/Y28FIYO
Что мне нужно изменить в коде, чтобы правильно сшивать изображения (показывать правую часть изображения вместо «черного блока»)?