main2.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import cv2
  2. import numpy as np
  3. MAX_FEATURES = 500 # 最大的特性
  4. GOOD_MATCH_PERCENT = 0.15 # 好的匹配百分比
  5. # '模板对比'
  6. def alignImages(im1, im2):
  7. # 将图像转换为灰度
  8. im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
  9. im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
  10. # 检测ORB特性和计算描述符
  11. orb = cv2.ORB_create(MAX_FEATURES)
  12. keypoints1, descriptors1 = orb.detectAndCompute(im1Gray, None)
  13. keypoints2, descriptors2 = orb.detectAndCompute(im2Gray, None)
  14. # 匹配特性
  15. matcher = cv2.DescriptorMatcher_create(
  16. cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
  17. matches = matcher.match(descriptors1, descriptors2, None)
  18. # 按分数对匹配进行排序
  19. matches.sort(key=lambda x: x.distance, reverse=False)
  20. # 删除不太好的匹配
  21. numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
  22. matches = matches[:numGoodMatches]
  23. # 画上匹配
  24. imMatches = cv2.drawMatches(
  25. im1, keypoints1, im2, keypoints2, matches, None)
  26. cv2.imwrite("matches.jpg", imMatches)
  27. # 提取好匹配的位置
  28. points1 = np.zeros((len(matches), 2), dtype=np.float32)
  29. points2 = np.zeros((len(matches), 2), dtype=np.float32)
  30. for i, match in enumerate(matches):
  31. points1[i, :] = keypoints1[match.queryIdx].pt
  32. points2[i, :] = keypoints2[match.trainIdx].pt
  33. # 发现单应性
  34. h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
  35. # Use homography
  36. height, width, channels = im2.shape
  37. im1Reg = cv2.warpPerspective(im1, h, (width, height))
  38. return im1Reg, h
  39. if __name__ == '__main__':
  40. # 读取参考图像
  41. refFilename = "./img/1.png"
  42. print("Reading reference image : ", refFilename)
  43. imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR)
  44. # 读取要对齐的图像
  45. imFilename = "./img/3.png"
  46. print("Reading image to align : ", imFilename)
  47. im = cv2.imread(imFilename, cv2.IMREAD_COLOR)
  48. print("Aligning images ...")
  49. # 注册的图像将在imReg中被重新定位。
  50. # 估计的单应式存储在h中。
  51. imReg, h = alignImages(im, imReference)
  52. # 将对齐的图像写入磁盘
  53. outFilename = "aligned.jpg"
  54. print("Saving aligned image : ", outFilename)
  55. cv2.imwrite(outFilename, imReg)
  56. # Print estimated homography
  57. print("Estimated homography : \n", h)