2015-09-13 40 views
2

我一直在下面通過使用快速KNN分類培訓的OpenCV設置的Python OCR例子here。我跟着第一個例子,並生成了一個knn_data.npz,用於稍後存儲培訓數據和培訓標籤。我想要現在做的是回顧,訓練數據,並將其應用到了它裏面的單個字符的OpenCV的圖像:通在OpenCV的圖像KNearest的find_nearest

# 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'圖像是10×10英寸的圖像所以它是完美的安全調整和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 

不過,我重塑了我的形象,使其佔據一行,並把它轉換成一個浮動,所以我不完全確定爲什麼會出現這個錯誤。有什麼建議麼?

回答

2

我才意識到爲什麼發生這種情況。爲了使kNN分類起作用,測試數據(或本例中的單個字母)需要具有與訓練數據完全相同的特徵數量。在這種情況下,我的訓練數據使用20x20的圖像,所以行矢量的長度爲400,但我的字母只有10x10。

我通過我的信擴大到20×20,並將其平坦化成大小爲400(20^2)的行向量固定這一點。

這並不一定由行向量必然要麼工作。測試數據可以像訓練數據一樣格式化爲矩陣,其中每行包含一個樣本,在這種情況下是一個字母。然後find_nearest將返回一個矩陣,其中每一行對應於測試數據。