u
							
								
							
								
							
								
							
								__author__ = 'wuluo'
							
								__version__ = '1.0.0'
							
								__company__ = u'重庆交大'
							
								__updated__ = '2019-06-14'
							
								import numpy as np
							
								import cv2 as cv
							
								from PIL import Image
							
								from matplotlib import pyplot as plt
							
								print('cv version: ', cv.__version__)
							
								 
							
								def pinjie():
							
								 top, bot, left, right = 100, 100, 0, 500
							
								 img1 = cv.imread('G:/2018and2019two/qianrushi/wuluo1.png')
							
								 cv.imshow("img1", img1)
							
								 img2 = cv.imread('G:/2018and2019two/qianrushi/wuluo2.png')
							
								 cv.imshow("img2", img2)
							
								 srcImg = cv.copyMakeBorder(
							
								  img1, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
							
								 testImg = cv.copyMakeBorder(
							
								  img2, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
							
								 img1gray = cv.cvtColor(srcImg, cv.COLOR_BGR2GRAY)
							
								 img2gray = cv.cvtColor(testImg, cv.COLOR_BGR2GRAY)
							
								 sift = cv.xfeatures2d_SIFT().create()
							
								 
							
								 kp1, des1 = sift.detectAndCompute(img1gray, None)
							
								 kp2, des2 = sift.detectAndCompute(img2gray, None)
							
								 
							
								 FLANN_INDEX_KDTREE = 1
							
								 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
							
								 search_params = dict(checks=50)
							
								 flann = cv.FlannBasedMatcher(index_params, search_params)
							
								 matches = flann.knnMatch(des1, des2, k=2)
							
								 
							
								 
							
								 matchesMask = [[0, 0] for i in range(len(matches))]
							
								 
							
								 good = []
							
								 pts1 = []
							
								 pts2 = []
							
								 
							
								 for i, (m, n) in enumerate(matches):
							
								  if m.distance < 0.7 * n.distance:
							
								   good.append(m)
							
								   pts2.append(kp2[m.trainIdx].pt)
							
								   pts1.append(kp1[m.queryIdx].pt)
							
								   matchesMask[i] = [1, 0]
							
								 
							
								 draw_params = dict(matchColor=(0, 255, 0),
							
								      singlePointColor=(255, 0, 0),
							
								      matchesMask=matchesMask,
							
								      flags=0)
							
								 img3 = cv.drawMatchesKnn(img1gray, kp1, img2gray,
							
								        kp2, matches, None, **draw_params)
							
								 
							
								 
							
								 rows, cols = srcImg.shape[:2]
							
								 MIN_MATCH_COUNT = 10
							
								 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 = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)
							
								  warpImg = cv.warpPerspective(testImg, np.array(
							
								   M), (testImg.shape[1], testImg.shape[0]), flags=cv.WARP_INVERSE_MAP)
							
								 
							
								  for col in range(0, cols):
							
								   if srcImg[:, col].any() and warpImg[:, col].any():
							
								    left = col
							
								    break
							
								  for col in range(cols - 1, 0, -1):
							
								   if srcImg[:, col].any() and warpImg[:, col].any():
							
								    right = col
							
								    break
							
								 
							
								  res = np.zeros([rows, cols, 3], np.uint8)
							
								  for row in range(0, rows):
							
								   for col in range(0, cols):
							
								    if not srcImg[row, col].any():
							
								     res[row, col] = warpImg[row, col]
							
								    elif not warpImg[row, col].any():
							
								     res[row, col] = srcImg[row, col]
							
								    else:
							
								     srcImgLen = float(abs(col - left))
							
								     testImgLen = float(abs(col - right))
							
								     alpha = srcImgLen / (srcImgLen + testImgLen)
							
								     res[row, col] = np.clip(
							
								      srcImg[row, col] * (1 - alpha) + warpImg[row, col] * alpha, 0, 255)
							
								 
							
								  
							
								  res = cv.cvtColor(res, cv.COLOR_BGR2RGB)
							
								  
							
								  plt.figure()
							
								  plt.imshow(res)
							
								  plt.show()
							
								 else:
							
								  print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT))
							
								  matchesMask = None
							
								 
							
								if __name__ == "__main__":
							
								 pinjie()