0

I am using this code for matching features on two images. The output is not that accurate, have lots of positive negatives. How is it possible to increase the accuracy overall? output Main Image

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    MIN_MATCH_COUNT = 10
    img1 = cv2.imread("/Users/anastasiya/Desktop/images/all_signs.jpg",0) # queryImage       
    img2 = cv2.imread("/Users/anastasiya/Desktop/images/template3.png",0) # trainImage
    sift = cv2.xfeatures2d.SIFT_create()
    kp1, des1 = sift.detectAndCompute(img1,None)
    kp2, des2 = sift.detectAndCompute(img2,None)
    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)
    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 = img2.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,3, cv2.LINE_AA)

    else:
        print ("Not enough matches are found" )

        matchesMask = None
        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()
    matches = flann.knnMatch(des1,des2,k=2)
    good = []
    for m,n in matches:
        if m.distance < 0.7*n.distance:
            good.append(m)

    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 = img2.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,3, cv2.LINE_AA)

    else:
        print ("Not enough matches are found" )

        matchesMask = None

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()

And when I am getting output, my training image (main one) is very compressed. Is it possible to get it in real size?

  • 2
    Can you post your template and image separately so we can see them in the true resolution, because it's impossible to know what's being matched currently. – alkasm Jul 02 '17 at 19:57
  • @AlexanderReynolds I have uploaded the image itself separately, unfortunately, I am not allowed to post more than 2 pics. – Anastasiya Jul 03 '17 at 12:55
  • I think the main problem is probably the scale---not because the algorithm can't deal with scale but because the symbols are very small and thus won't have many features. You might try template matching at multiple scales ([see for e.g.](http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/)) or trying to resize your template a little bit before running feature detection. – alkasm Jul 03 '17 at 19:23
  • @AlexanderReynolds thank you, yes I was trying to reshape the images, but after completing the resize and reshape function. I got an error that depth of the image is not expected. I used this: from skimage.transform import resize im = resize(im, (300, 300), mode='constant') im.shape – Anastasiya Jul 04 '17 at 18:58

0 Answers0