2020-10-21

it2025-04-27  17

import numpy as np 2 import cv2 as cv 3 from matplotlib import pyplot as plt 4 5 if name == ‘main’: 6 top, bot, left, right = 100, 100, 0, 500 7 img1 = cv.imread(‘test1.jpg’) 8 img2 = cv.imread(‘test2.jpg’) 9 srcImg = cv.copyMakeBorder(img1, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0)) 10 testImg = cv.copyMakeBorder(img2, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0)) 11 img1gray = cv.cvtColor(srcImg, cv.COLOR_BGR2GRAY) 12 img2gray = cv.cvtColor(testImg, cv.COLOR_BGR2GRAY) 13 sift = cv.xfeatures2d_SIFT().create() 14 # find the keypoints and descriptors with SIFT 15 kp1, des1 = sift.detectAndCompute(img1gray, None) 16 kp2, des2 = sift.detectAndCompute(img2gray, None) 17 # FLANN parameters 18 FLANN_INDEX_KDTREE = 1 19 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) 20 search_params = dict(checks=50) 21 flann = cv.FlannBasedMatcher(index_params, search_params) 22 matches = flann.knnMatch(des1, des2, k=2) 23 24 # Need to draw only good matches, so create a mask 25 matchesMask = [[0, 0] for i in range(len(matches))] 26 27 good = [] 28 pts1 = [] 29 pts2 = [] 30 # ratio test as per Lowe’s paper 31 for i, (m, n) in enumerate(matches): 32 if m.distance < 0.7*n.distance: 33 good.append(m) 34 pts2.append(kp2[m.trainIdx].pt) 35 pts1.append(kp1[m.queryIdx].pt) 36 matchesMask[i] = [1, 0] 37 38 draw_params = dict(matchColor=(0, 255, 0), 39 singlePointColor=(255, 0, 0), 40 matchesMask=matchesMask, 41 flags=0) 42 img3 = cv.drawMatchesKnn(img1gray, kp1, img2gray, kp2, matches, None, **draw_params) 43 plt.imshow(img3, ), plt.show() 44 45 rows, cols = srcImg.shape[:2] 46 MIN_MATCH_COUNT = 10 47 if len(good) > MIN_MATCH_COUNT: 48 src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) 49 dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) 50 M, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0) 51 warpImg = cv.warpPerspective(testImg, np.array(M), (testImg.shape[1], testImg.shape[0]), flags=cv.WARP_INVERSE_MAP) 52 53 for col in range(0, cols): 54 if srcImg[:, col].any() and warpImg[:, col].any(): 55 left = col 56 break 57 for col in range(cols-1, 0, -1): 58 if srcImg[:, col].any() and warpImg[:, col].any(): 59 right = col 60 break 61 62 res = np.zeros([rows, cols, 3], np.uint8) 63 for row in range(0, rows): 64 for col in range(0, cols): 65 if not srcImg[row, col].any(): 66 res[row, col] = warpImg[row, col] 67 elif not warpImg[row, col].any(): 68 res[row, col] = srcImg[row, col] 69 else: 70 srcImgLen = float(abs(col - left)) 71 testImgLen = float(abs(col - right)) 72 alpha = srcImgLen / (srcImgLen + testImgLen) 73 res[row, col] = np.clip(srcImg[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255) 74 75 # opencv is bgr, matplotlib is rgb 76 res = cv.cvtColor(res, cv.COLOR_BGR2RGB) 77 # show the result 78 plt.figure() 79 plt.imshow(res) 80 plt.show() 81 else: 82 print(“Not enough matches are found - {}/{}”.format(len(good), MIN_MATCH_COUNT)) 83 matchesMask = None

最新回复(0)