Python 将OpenCV图像传递给KNearest';让我们找到最近的

Python 将OpenCV图像传递给KNearest';让我们找到最近的,python,opencv,numpy,ocr,knn,Python,Opencv,Numpy,Ocr,Knn,我一直在学习通过使用kNN分类训练OpenCV为OCR设置Python的示例。我遵循第一个示例,生成了一个knn_data.npz,用于存储培训数据和培训标签,以备以后使用。我现在要做的是回忆训练数据,并将其应用到OpenCV图像中,该图像中只有一个字符: # Load training data trainingData = np.load('knn_data.npz') train = trainingData['train'] trainLabels = trainingData['tr

我一直在学习通过使用kNN分类训练OpenCV为OCR设置Python的示例。我遵循第一个示例,生成了一个
knn_data.npz
,用于存储培训数据和培训标签,以备以后使用。我现在要做的是回忆训练数据,并将其应用到OpenCV图像中,该图像中只有一个字符:

# Load training data
trainingData = np.load('knn_data.npz')
train = trainingData['train'] 
trainLabels = trainingData['train_labels']

knn = cv2.KNearest()
knn.train(train, trainLabels)

letter = cv2.imread('letter.png')
letter = cv2.cvtColor(letter, cv2.COLOR_BGR2GRAY)
print letter.shape
letter = letter.reshape((1,100))
letter = np.float32(letter)
print letter.shape

ret, result, neighbors, dist = knn.find_nearest(letter, k=5)
print result
'letter.png'
图像是一个10x10的图像,因此调整图像大小非常安全,numpy成功地将图像大小调整为一维形状数组(1100)。但是,当我尝试将其传递到
knn.find_nearest(…)
函数时,我得到一个错误,即使用浮点矩阵:

OpenCV Error: Bad argument (Input samples must be floating-point matrix (<num_samples>x<var_count>)) in find_nearest, file /build/buildd/opencv-2.4.8+dfsg1/modules/ml/src/knearest.cpp, line 370
Traceback (most recent call last):
  File "sudoku.py", line 103, in <module>
    ret, result, neighbors, dist = knn.find_nearest(letter, k=5)
cv2.error: /build/buildd/opencv-2.4.8+dfsg1/modules/ml/src/knearest.cpp:370: error: (-5) Input samples must be floating-point matrix (<num_samples>x<var_count>) in function find_nearest
OpenCV错误:find_nearest文件/build/buildd/OpenCV-2.4.8+dfsg1/modules/ml/src/knearest.cpp第370行中的参数错误(输入样本必须是浮点矩阵(x))
回溯(最近一次呼叫最后一次):
文件“sudoku.py”,第103行,在
ret,result,neights,dist=knn.查找最近的(字母,k=5)
cv2.error:/build/buildd/opencv-2.4.8+dfsg1/modules/ml/src/knearest.cpp:370:error:(-5)输入样本必须是函数find_中的浮点矩阵(x)

然而,我重新塑造了我的图像,使其占据一行,并将其转换为一个浮点,所以我不完全确定为什么会出现这个错误。有什么建议吗

我才意识到为什么会这样。为了使kNN分类发挥作用,测试数据(或本例中的单个字母)需要具有与训练数据完全相同的特征数。在本例中,我的训练数据使用20x20图像,因此行向量的长度为400,但我的字母仅为10x10

我通过将我的字母放大到20x20并将其展平为大小为400(20^2)的行向量来解决这个问题

这也不一定要通过行向量来实现。测试数据可以像训练数据一样格式化为矩阵,其中每行包含一个样本,在本例中为一个字母。然后,
find_nearest
将返回一个矩阵,其中每行对应于测试数据