Python. K最近邻算法 TypeError:样本数据类型=17不支持。

3
我将尝试使用SIFT检测和计算关键点和描述符来对一些图像进行分类,然后使用KNN进行分类:
以下是我的代码:
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张图片的列表,所以循环会检测并计算每一张图片的关键点和描述符。我给你几张图片,感谢。

输入图像描述

输入图像描述

输入图像描述


你能否包含一个缩小的样本数据集来演示,比如三张图片? - tfv
如果您提供完整的代码(包括导入语句、文件名等)和可用数据,我们可以更快地回复您并进行复现。 - tfv
@tfv 我编辑了帖子,请查看。感谢您的建议。 - Jose
好的,我的第一个想法是对于这种类型的图像使用特征(例如纹理特征)而不是关键点,但我会尝试看看。 - tfv
你使用的cv2版本是什么? - tfv
1个回答

0

无论如何,我的感觉是你少了一行代码

import numpy as np

sift = cv2.SIFT()

在你的代码中的某个地方。

对于我来说,实际上重现你的问题的代码(包括由于我的版本CV 2.4.12而进行的一些更改)如下所示。

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

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

哦,我明白了,是的,我忘记在代码中包含这些行了,我的错。感谢@tfv帮我澄清了很多事情,谢谢。OpenCV的版本是3.1.0,来自Itseez/opencv_contrib GitHub仓库的额外模块。 - Jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接