2016-04-29 38 views
3

我想使用一些图像SIFT的检测和计算关键点和描述符,然后用KNN分类为它们进行分类:Python。 K近邻类型错误:样本数据类型= 17不支持

这是我的小码:

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) 

但我有点卡住下一个错误

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

文件是用10张名单,因此该循环检测并计算柯每个图像的y点和描述符。我给你一些images.Thanks

enter image description here

enter image description here

enter image description here

+0

你可以包含缩减的样本日期集来证明,maby三张图片吗? – tfv

+0

如果代码完整(包括导入语句,文件名等)和可用的数据以便我们可以复制它,您可能会得到更快的响应。 – tfv

+0

@tfv我编辑了这篇文章。核实。感谢您的建议 – Jose

回答

0

在任何情况下,我的感觉是你缺少一个行

import numpy as np 

sift = cv2.SIFT() 

代码中的某处。

对我来说,下面附上了实际再现您问题的代码(包括由于我的版本CV 2.4.12所做的一些更改)。

但是,我担心你选择的方法根本不适用于K最近邻(KNN)。 KNN测量属于不同样本的特征向量之间的距离。然而,对于所有特征向量,矢量的每个分量需要具有相同的含义(例如,一个特征是图像的平均亮度值)。因此该功能始终需要显示在您的vecort的相同位置。

在SUFT中,您正在创建不同图像关键点的坐标。最重要的是,每个图像的特征向量长度都不相同,所以不能应用kNN。显然,这些坐标作为用于比较不同图像的特征矢量的一部分是没有意义的。

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

哦,我明白了,是的,我忘了在代码中包含这些行,我的错误。谢谢,@tfv清除了很多东西,谢谢。 OpenCV的版本是3.1.0,带有来自Itseez/opencv_contrib github存储库的额外模块 – Jose

相关问题