2014-10-10 5 views
8

Ich versuche, den Code aus diesem URL auszuführen. Allerdings begann ich diesen Fehler:Valueerror: Gesamtgröße des neuen Arrays müssen unverändert sein

des = np.array(des,np.float32).reshape((1,128)) 
ValueError: total size of new array must be unchanged 

ich aber keine größeren Änderungen vorgenommen haben. Aber ich werde einfügen, was ich tat:

import scipy as sp 
import numpy as np 
import cv2 

# Load the images 
img =cv2.imread("image1.png") 

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

# SURF extraction 
surf = cv2.FeatureDetector_create("SURF") 
surfDescriptorExtractor = cv2.DescriptorExtractor_create("SURF") 
kp = surf.detect(imgg) 
kp, descritors = surfDescriptorExtractor.compute(imgg,kp) 

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

modelImages = ["image2.png"] 

for modelImage in modelImages: 

    # Now loading a template image and searching for similar keypoints 
    template = cv2.imread(modelImage) 
    templateg= cv2.cvtColor(template,cv2.COLOR_BGR2GRAY) 
    keys = surf.detect(templateg) 

    keys,desc = surfDescriptorExtractor.compute(templateg, keys) 

    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.imshow('img',img) 
    cv2.imshow('tm',template) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows() 

Jede Hilfe zu diesem Thema wird sehr geschätzt.

+2

Wie ist die Form Ihres Arrays vor dieser Linie? – polku

+0

Kannst du '.reshape (128)' nicht einfach tun? Stellen Sie außerdem sicher, dass "np.array (des, np.float32)" eine Gesamtgröße von 128 hat. –

+0

a-Jays: Ich habe das versucht, das hat nicht geholfen. – Rakanid

Antwort

18

hatte ich das gleiche Problem. Ich habe festgestellt, dass ich die Datenlänge geändert habe. Ein Produkt von reshape Argumente sollte auf eine Länge eines Arrays gleich sein, die Sie ändern möchten. In Ihrem Fall:

des = np.array(des,np.float32).reshape(1, len(des)) 
+0

Dimensionen meiner Array (100,99) und ich muss es machen (100,100). Wie kann das gemacht werden? –

Verwandte Themen