1. 程式人生 > >應用OpenCV進行OCR字元識別

應用OpenCV進行OCR字元識別

opencv自帶一個字元識別的例子,它的重點不是OCR字元識別,而主要是演示機器學習的應用。它應用的是UCI提供的字元資料(特徵資料)。

這些例子都只能用於學習OpenCV或熟悉OCR的簡單流程,因為它們與當前比較專業的OCR引擎的識別率相去甚遠。

這裡寫下OpenCV下OCR的流程:

1. 特徵提取

2. 訓練

3. 識別

特徵提取

1. 在影象預處理後,提取出字元相關的ROI影象,並且大小歸一化,整個影象的畫素值序列可以直接作為特徵。damiles是直接將整個字元影象轉換化為vector向量特徵作為特徵輸入的。

2. 但直接將整個影象作為特徵資料維度太高,計算量太大,所以也可以進行一些降維處理,減少輸入的資料量。

拿到字元的ROI影象,二值化。將影象分塊,然後統計每個小塊中非0畫素的個數,這樣就形成了一個較小的矩陣,這矩陣就是新的特徵了。

OpenCV中letter_recog例子就是使用的其特徵資料。

訓練與識別

訓練與識別一般都採用同一種機器學習方法:

DAMILES應用了KNearest方法,對輸入資料進行訓練和識別。

1. 資料輸入:

getData()函式中:

為trainData和trainClasses設定資料。

2. 初始化機器學習演算法,及其訓練

knn=new CvKNearest( trainData, trainClasses, 0, false, K );

trainData, trainClasses資料已得到。

而K是分類的數目。

訓練在CvKNearest演算法初始化中已經完成

3. 識別

獲取識別測試的資料,testData

result=knn->find_nearest(testData,K,0,0,nearest,0);

result為識別的結果。

而OpenCV自帶例子中,提供了boost,mlp,knearest,nbayes,svm,rtrees這些機器學習方法,進行訓練和識別。

處理的步驟和方式都類似。

這些例子的識別率不是很高,OCR識別率在90%以上才有較好的使用意義,所以,OCR還需要更多特徵和分析方法,來提高識別率,tesseract是一個不錯的開源OCR引擎。

-------------------

在tesseract最初的字型庫裡,一種字型的字元樣本庫包括:94個字元,8種大小,4種字型(正常,粗體,斜體,斜粗體),每種20個樣本,共60160個樣本。

與UIC提供的字型庫不同的是,tesseract提供的是標準印刷體字型庫的識別,而UIC提供是手寫體handwriting的特徵資料。

資料之美提到,G公司(應該就是google了)的研究結果表明,在自然語言與機器翻譯領域,簡單模型加上大量有效樣本資料,比複雜模型加上小樣本資料,有效的多。 這個結論應該適用機器學習的很多領域。運算足夠快,樣本足夠大,即使簡單的模型,效果可能會出人意料。

由此可見,收集有效的、大量的樣本庫是多麼的重要。