OpenCV SURF for live streaming from webcam in Python

785 views Asked by At

I am working on surf implementation in opencv using python which will detect the template in the given image. I have modified the code such that it will take video capture from the webcam connected and convert into images and then apply surf on it. Following is the modified code.

import cv2
import numpy as np


cap = cv2.VideoCapture(0)

while(True):

        ret ,img = cap.read()

# Convert them to grayscale
        imgg =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# SURF extraction
    surf = cv2.SURF()
    kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False)

# Setting up samples and responses for kNN
    samples = np.array(descritors) 
    responses = np.arange(len(kp),dtype = np.float32)

# kNN training
    knn = cv2.KNearest()
    knn.train(samples,responses)

# Now loading a template image and searching for similar keypoints
    template = cv2.imread('template.png')
    templateg= cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
    keys,desc = surf.detect(templateg,None,useProvidedKeypoints = False)

    for h,des in enumerate(desc):
            des = np.array(des,np.float32).reshape((1,128))
            retval, results, neigh_resp, dists = knn.find_nearest(des,1)
            res,dist =  int(results[0][0]),dists[0][0]

            if dist<0.1: # draw matched keypoints in red color
                color = (0,0,255)
            else:  # draw unmatched in blue color
                print dist
                color = (255,0,0)

    #Draw matched key points on original image
            x,y = kp[res].pt
            center = (int(x),int(y))
            cv2.circle(img,center,2,color,-1)

    #Draw matched key points on template image
            x,y = keys[h].pt
            center = (int(x),int(y))
            cv2.circle(template,center,2,color,-1)

    cv2.imwrite('img',img)
    cv2.imwrite('tm',template)
    cv2.waitKey(0)
cap.release()

But the error which is coming is knn.train(samples,responses) TyepError: data type = 17 is not supported

Does anybody have any idea on this?

1

There are 1 answers

1
Eric On

CV probably expects regular arrays but you are passing numpy arrays instead. Try this

knn.train(samples.tolist(),responses.tolist())