2016-04-29 13 views
3
unterstützt

Ich versuche, einige Bilder zu klassifizieren, indem sie SIFT für erfassen und berechnen keypoints und Deskriptoren, und dann KNN verwenden für klassifizieren:Python. K-Nächster-Nachbar-Typeerror: Proben-Datentyp = 17 nicht

Das ist mein wenig Code:

import os 
import cv2 

## Prepare images files 
rootpath = '/Some/Directory' 
files = [] 
for filedir, dirs, filess in os.walk(rootpath): 
    for filename in filess: 
     pathfile = os.path.join(filedir, filename) 
     files.append(pathfile) 

## Detect keypoints and compute descriptors for train images 
kp_train = [] 
dsc_train = [] 
for file in files: 
    ima = cv2.imread(file) 
    gray=cv2.cvtColor(ima,cv2.COLOR_BGR2GRAY) 
    kpts, des = sift.detectAndCompute(gray, None) 
    kp_train.append(kpts) 
    dsc_train.append(des) 

## Train knn 
dsc_train = np.array(dsc_train) 
responses = np.arange(len(kp_train),dtype = np.float32) 
knn = cv2.ml.KNearest_create() 
knn.train(dsc_train, cv2.ml.ROW_SAMPLE, responses) 

Aber ich bin ein wenig hängen mit dem nächsten Fehler

>>> knn.train(dsc_train,cv2.ml.ROW_SAMPLE,responses) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: dsc_train data type = 17 is not supported 

Dateien ist eine Liste mit 10 Bildern, so dass die Schleife erfasst und berechnet ke Ypoints und Deskriptor für jedes Bild. Ich gebe Ihnen einige images.Thanks

enter image description here

enter image description here

enter image description here

+0

Können Sie einen reduzierten Satz von Beispieldaten mit einbeziehen, um drei Bilder zu demonstrieren? – tfv

+0

Sie können eine schnellere Antwort erhalten, wenn der Code vollständig ist (einschließlich Importanweisungen, Dateinamen usw.) und Daten verfügbar sind, damit wir sie reproduzieren können. – tfv

+0

@tfv Ich habe den Beitrag bearbeitet. Prüfen Sie. Danke für die Ratschläge – Jose

Antwort

0

Auf jeden Fall mein Gefühl ist, dass Sie ein Linien

import numpy as np 

und

fehlen
sift = cv2.SIFT() 

irgendwo in Ihrem Code.

Für mich ist der Code, der Ihr Problem tatsächlich reproduziert (einschließlich einiger Änderungen aufgrund meiner Version CV 2.4.12) unten beigefügt.

Allerdings befürchte ich, dass der von Ihnen gewählte Ansatz überhaupt nicht für K-nearest Neighbour (KNN) geeignet ist. KNN misst den Abstand zwischen Merkmalsvektoren, die zu verschiedenen Abtastwerten gehören. Für alle Merkmalsvektoren muss jedoch jede Komponente des Vektors die gleiche Bedeutung haben (z. B. ein Merkmal ist der durchschnittliche Helligkeitswert eines Bildes). Dieses Feature muss also immer an der gleichen Position Ihres vecort erscheinen.

In SUFT erstellen Sie Koordinaten von Schlüsselpunkten verschiedener Bilder. Am wichtigsten ist, dass die Länge der Merkmalsvektoren für jedes Bild unterschiedlich ist, so dass Sie kNN nicht anwenden können. Offensichtlich sind diese Koordinaten als Teil eines Merkmalsvektors, der zum Vergleichen zwischen verschiedenen Bildern verwendet wird, nicht sinnvoll.

import os 
import cv2 #Using CV 2.4.12 
import numpy as np 

## Prepare images files 
rootpath = 'images/' 
files = [] 
for filedir, dirs, filess in os.walk(rootpath): 
    for filename in filess: 
     pathfile = os.path.join(filedir, filename) 
     files.append(pathfile) 

print files 

## Detect keypoints and compute descriptors for train images 
kp_train = [] 
dsc_train = [] 
sift = cv2.SIFT() 
for file in files: 
    ima = cv2.imread(file) 
    print file 
    gray=cv2.cvtColor(ima,cv2.COLOR_BGR2GRAY) 
    kpts, des = sift.detectAndCompute(gray, None) #sift = cv2.xfeatures2d.SIFT_create() 
    kp_train.append(kpts) 
    dsc_train.append(des) 

## Train knn 
dsc_train = np.array(dsc_train) 
responses = np.arange(len(kp_train),dtype = np.float32) 
knn = cv2.KNearest() 

#Next line does not work: 
knn.train(dsc_train, responses) 
+0

Ohhh, ich sehe, ja, ich habe vergessen, diese Zeilen in den Code aufzunehmen, mein Fehler. Danke, @tfv räume mir viele Dinge auf, danke. Und die Version von OpenCV ist 3.1.0 mit zusätzlichen Modulen von Itseez/opencv_contrib github-Repository – Jose

Verwandte Themen