上面的字数超了,代码贴不了,补上
import numpy as np import cv2 from matplotlib import pyplot as plt MIN_MATCH_COUNT = 10 #设置最低特征点匹配数量为10 template = cv2.imread('template_adjust.jpg',0) target = cv2.imread('target.jpg',0) sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(template,None) kp2, des2 = sift.detectAndCompute(target,None) FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks = 50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1,des2,k=2) good = [] for m,n in matches: if m.distance < 0.7*n.distance: good.append(m) if len(good)>MIN_MATCH_COUNT: src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2) dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) matchesMask = mask.ravel().tolist() h,w = template.shape pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) dst = cv2.perspectiveTransform(pts,M) cv2.polylines(target,[np.int32(dst)],True,0,2, cv2.LINE_AA) else: print( "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)) matchesMask = None draw_params = dict(matchColor=(0,255,0), singlePointColor=None, matchesMask=matchesMask, flags=2) result = cv2.drawMatches(template,kp1,target,kp2,good,None,**draw_params) plt.imshow(result, 'gray') plt.show()