将OpenCV图像传递给KNearest的find_nearest

时间:2015-09-13 18:55:36

标签: python opencv numpy ocr knn

通过使用kNN分类训练OpenCV,我一直在关注设置Python for OCR的示例here。我按照第一个示例生成了一个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成功地将图像调整为一维形状阵列(1,100)。但是,当我尝试将其传递给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

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

1 个答案:

答案 0 :(得分:2)

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

我通过将我的字母放大到20x20并将其展平为大小为400(20 ^ 2)的行向量来修复此问题。

这不一定必须通过行向量来工作。测试数据可以格式化为与训练数据完全相同的矩阵,其中每行包含一个样本,在本例中为一个字母。然后find_nearest将返回一个矩阵,其中每行对应于测试数据。