Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- img1 = cv2.imread('/home/alex/Downloads/snapshot (2).jpg',0) #queryimage # left image
- img2 = cv2.imread('/home/alex/Downloads/snapshot (1).jpg',0) #trainimage # right image
- sift = cv2.xfeatures2d.SIFT_create()
- # find the keypoints and descriptors with SIFT
- kp1, des1 = sift.detectAndCompute(img1,None)
- kp2, des2 = sift.detectAndCompute(img2,None)
- # FLANN parameters
- 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 = []
- pts1 = []
- pts2 = []
- # ratio test as per Lowe's paper
- for i,(m,n) in enumerate(matches):
- if m.distance < 0.8*n.distance:
- good.append(m)
- pts2.append(kp2[m.trainIdx].pt)
- pts1.append(kp1[m.queryIdx].pt)
- pts1 = np.int32(pts1)
- pts2 = np.int32(pts2)
- F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
- # We select only inlier points
- pts1 = pts1[mask.ravel()==1]
- pts2 = pts2[mask.ravel()==1]
- def drawlines(img1,img2,lines,pts1,pts2):
- ''' img1 - image on which we draw the epilines for the points in img2
- lines - corresponding epilines '''
- r,c = img1.shape
- img1 = cv2.cvtColor(img1,cv2.COLOR_GRAY2BGR)
- img2 = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR)
- for r,pt1,pt2 in zip(lines,pts1,pts2):
- color = tuple(np.random.randint(0,255,3).tolist())
- x0,y0 = map(int, [0, -r[2]/r[1] ])
- x1,y1 = map(int, [c, -(r[2]+r[0]*c)/r[1] ])
- img1 = cv2.line(img1, (x0,y0), (x1,y1), color,1)
- img1 = cv2.circle(img1,tuple(pt1),5,color,-1)
- img2 = cv2.circle(img2,tuple(pt2),5,color,-1)
- return img1,img2
- print(F)
- # Find epilines corresponding to points in right image (second image) and
- # drawing its lines on left image
- lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1,1,2), 2,F)
- lines1 = lines1.reshape(-1,3)
- img5,img6 = drawlines(img1,img2,lines1,pts1,pts2)
- # Find epilines corresponding to points in left image (first image) and
- # drawing its lines on right image
- lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1,1,2), 1,F)
- lines2 = lines2.reshape(-1,3)
- img3,img4 = drawlines(img2,img1,lines2,pts2,pts1)
- print(img1.shape == img2.shape)
- cv2.imshow('combined', np.hstack([img5, img3]))
- cv2.waitKey(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement