python - 将 OpenCV 图像传入 KNearest 的 find_nearest

标签 python opencv numpy ocr knn

我一直在关注示例 here通过使用 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 成功地将图像大小调整为形状 (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

但是,我重新调整了图像的形状,使其占据一行并将其转换为 float ,因此我不完全确定为什么会出现此错误。有什么建议么?

最佳答案

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

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

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

关于python - 将 OpenCV 图像传入 KNearest 的 find_nearest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553377/

相关文章:

python - Tensorflow - 具有多个 channel 的 2D 卷积

java - `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

macos - 在 Mac 上构建 openCV 3.0.0 时出错

python - Python + scipy 中 sigmoid 回归的参数

python - 数据帧中的矢量化标志分配

python - 在 PuLP(Python) 中指定 lowBound 和 upBound

python 无法导入模块

python - 没有名为 _testcapi 的模块

c++ - Qt 与 OpenCv 不执行任何操作

python - 除了 RAM 之外,还有哪些因素限制了 Numpy 数组的大小?这些因素可以调整吗?