python cv2 sift match

10693 ワード

#coding=utf-8

import cv2
import numpy as np

print(cv2.__version__)#3.2.0
def visualize_matches(image1, keypoints1, image2, keypoints2, matches):
  m_image = np.array([])
  m_image = cv2.drawMatches(
      image1, keypoints1,
      image2, keypoints2,
      [match[0] for match in matches],
      m_image)
  cv2.imshow('PROJ_WIN', m_image)
  cv2.waitKey()

img = cv2.imread('img_write.tif', cv2.IMREAD_ANYCOLOR)
print(img.shape)
img_graycolor=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_match = cv2.imread('test1.jpg', cv2.IMREAD_ANYCOLOR)
print(img_match.shape)
img_match_graycolor=cv2.cvtColor(img_match, cv2.COLOR_RGB2GRAY)

# detector_sift=cv2.xfeatures2d.SIFT_create()
# keypoints1=detector_sift.detect(img)
# keypoints2=detector_sift.detect(img_match)
# print(len(keypoints1))
descriptor_sift=cv2.xfeatures2d.SIFT_create()
# keypoints1, descriptors1 = descriptor_sift.compute(img_graycolor,keypoints1)
# keypoints2, descriptors2 = descriptor_sift.compute(img_match_graycolor,keypoints2)
keypoints1, descriptors1 = descriptor_sift.detectAndCompute(img_graycolor,None)
keypoints2, descriptors2 = descriptor_sift.detectAndCompute(img_match_graycolor,None)
print(len(keypoints1),len(descriptors1))
print(len(keypoints2),len(descriptors2))
# print(keypoints1)

matcher = cv2.BFMatcher()

matches = matcher.knnMatch(descriptors1, descriptors2, k=2)
matches = sorted(matches, key=lambda x: x[0].distance)

good = []
for m, n in matches:
    if m.distance < 0.7 * n.distance:
        good.append(m)
        # print(m)
print(len(good))
visualize_matches(img_graycolor, keypoints1, img_match_graycolor, keypoints2, matches[:100])

src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[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 = img.shape[:2]
pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, M)
print(dst[0][0][0],dst[0][0][1],dst[2][0][0],dst[2][0][1])




# print(cv2.__version__)#2.4.9
# img = cv2.imread('test1.jpg', cv2.IMREAD_ANYCOLOR)
# print(img.shape)
# img_graycolor=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# min_hessian = 400
# SURF = cv2.SURF(min_hessian)
# key_query, desc_query = SURF.detectAndCompute(img_graycolor, None)
#
# img_match = cv2.imread('img_write.tif', cv2.IMREAD_ANYCOLOR)
# print(img_match.shape)
# img_match_graycolor=cv2.cvtColor(img_match, cv2.COLOR_RGB2GRAY)
# # min_hessian = 400
# # SURF = cv2.SURF(min_hessian)
# key_query_match, desc_query_match = SURF.detectAndCompute(img_match_graycolor, None)
#
#
# imgOut = cv2.drawKeypoints(img_graycolor, key_query, None, (255, 0, 0), 4)
# # cv2.imshow('imgOut', imgOut)
# # cv2.waitKey()
#
# 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(desc_query, desc_query_match, k=2)
# # print(matches)
# # discard bad matches, ratio test as per Lowe's paper
# good_matches = filter(lambda x: x[0].distance<0.7*x[1].distance, matches)
# print(len(good_matches))
# def draw_good_matches(img1, kp1, img2, kp2, matches):
#     # Create a new output image that concatenates the
#     # two images together (a.k.a) a montage
#     rows1, cols1 = img1.shape[:2]
#     rows2, cols2 = img2.shape[:2]
#     out = np.zeros((max([rows1, rows2]), cols1+cols2, 3), dtype='uint8')
#     # Place the first image to the left, copy 3x for RGB
#     out[:rows1, :cols1, :] = np.dstack([img1, img1, img1])
#     # Place the next image to the right of it, copy 3x for RGB
#     out[:rows2, cols1:cols1 + cols2, :] = np.dstack([img2, img2, img2])
#     for m in matches:
#         # Get the matching keypoints for each of the images
#         print(m)
#         # c1, r1 = kp1[m[0]].pt
#         # c2, r2 = kp2[m[1]].pt
#         c1, r1 = kp1[m.trainIdx].pt
#         c2, r2 = kp2[m.queryIdx].pt
#     radius = 4
#     BLUE = (255, 0, 0)
#     thickness = 1
#     # Draw a small circle at both co-ordinates
#     cv2.circle(out, (int(c1), int(r1)), radius, BLUE, thickness)
#     cv2.circle(out, (int(c2) + cols1, int(r2)), radius, BLUE, thickness)
#     # Draw a line in between the two points
#     cv2.line(out, (int(c1), int(r1)), (int(c2) + cols1, int(r2)), BLUE, thickness)
#     return out
# cv2.imshow('imgFlann', draw_good_matches(img_graycolor, key_query,
#                                          img_match_graycolor, key_query_match, good_matches))