demo_match_opencv_sift.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from PIL import Image
  2. import numpy as np
  3. import numpy as np
  4. import cv2 as cv
  5. import matplotlib.pyplot as plt
  6. if __name__ == "__main__":
  7. from argparse import ArgumentParser
  8. parser = ArgumentParser()
  9. parser.add_argument("--im_A_path", default="assets/toronto_A.jpg", type=str)
  10. parser.add_argument("--im_B_path", default="assets/toronto_B.jpg", type=str)
  11. parser.add_argument("--save_path", default="demo/roma_warp_toronto.jpg", type=str)
  12. args, _ = parser.parse_known_args()
  13. im1_path = args.im_A_path
  14. im2_path = args.im_B_path
  15. save_path = args.save_path
  16. img1 = cv.imread(im1_path,cv.IMREAD_GRAYSCALE) # queryImage
  17. img2 = cv.imread(im2_path,cv.IMREAD_GRAYSCALE) # trainImage
  18. # Initiate SIFT detector
  19. sift = cv.SIFT_create()
  20. # find the keypoints and descriptors with SIFT
  21. kp1, des1 = sift.detectAndCompute(img1,None)
  22. kp2, des2 = sift.detectAndCompute(img2,None)
  23. # BFMatcher with default params
  24. bf = cv.BFMatcher()
  25. matches = bf.knnMatch(des1,des2,k=2)
  26. # Apply ratio test
  27. good = []
  28. for m,n in matches:
  29. if m.distance < 0.75*n.distance:
  30. good.append([m])
  31. # cv.drawMatchesKnn expects list of lists as matches.
  32. draw_params = dict(matchColor = (255,0,0), # draw matches in red color
  33. singlePointColor = None,
  34. flags = 2)
  35. img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good,None,**draw_params)
  36. Image.fromarray(img3).save("demo/sift_matches.png")