What images are recognized best with template matching

asked 2015-03-11 10:06:25 -0500

Hello! My problem is this: I have a set of kids' cubes and I need a programme that will be able to recognize them on an image. (find coordinates of each cube) Here is the code I'm using:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('pictures/newnao.jpg',0)
img2 = img.copy()
template = cv2.imread('pictures/blue.jpg',0)
w, h = template.shape[::-1]

# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
            'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for meth in methods:
    img = img2.copy()
    method = eval(meth)

    # Apply template Matching
    res = cv2.matchTemplate(img,template,method)    
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    cv2.rectangle(img,top_left, bottom_right, 100, 20)

    plt.subplot(121),plt.imshow(res,cmap = 'gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(img)
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)

    plt.show()

To make the cubes different from each other I can stick some images on them. So, what I want to know is what kind of pictures I should use to make it more efficient. The camera I'm using is the one built in the head of the robot NAO. The quality of pictures is not very good. newnao1.jpg

edit retag flag offensive close merge delete

Comments

Why make it so difficult and not split purely on color? It seems a easy setup to apply it too :)

StevenPuttemans gravatar imageStevenPuttemans ( 2015-03-12 05:55:56 -0500 )edit