Created
October 24, 2020 20:14
-
-
Save islem-esi/9ce4a44de7b22f379fd3f0694c1d3243 to your computer and use it in GitHub Desktop.
open and find features
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define the minimum matching keypoints to consider an object as a match | |
MIN_MATCH_COUNT = 10 | |
#read the letter we are looking for | |
img1 = cv2.imread('a4.png',0) | |
#read the captcha | |
img2 = cv2.imread('aydpat.jpg',0) # trainImage | |
# Initiate SIFT detector | |
sift = cv2.SIFT_create() | |
# find the keypoints and descriptors with SIFT | |
kp1, des1 = sift.detectAndCompute(img1,None) | |
kp2, des2 = sift.detectAndCompute(img2,None) | |
#Those are some parameters, don't mind them | |
FLANN_INDEX_KDTREE = 0 | |
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) | |
search_params = dict(checks = 50) | |
#create matcher and match | |
flann = cv2.FlannBasedMatcher(index_params, search_params) | |
matches = flann.knnMatch(des1,des2,k=2) | |
# store all the good matches as per Lowe's ratio test. | |
good = [] | |
for m,n in matches: | |
if m.distance < 0.8*n.distance: | |
good.append(m) | |
#do some calculations to show matched features | |
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 = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) | |
matchesMask = mask.ravel().tolist() | |
h,w = img1.shape | |
pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) | |
dst = cv2.perspectiveTransform(pts,M) | |
img2 = cv2.polylines(img2,[np.int32(dst)],True,255,1, cv2.LINE_AA) | |
else: | |
print("Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT)) | |
matchesMask = None | |
#draw and show | |
draw_params = dict(matchColor = (0,255,0), # draw matches in green color | |
singlePointColor = None, | |
matchesMask = matchesMask, # draw only inliers | |
flags = 2) | |
img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params) | |
plt.imshow(img3, 'gray'),plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment