opencv自帶一個(gè)字符識別的例子,它的重點(diǎn)不是OCR字符識別,而主要是演示機器學(xué)習的應用。它應用的是UCI提供的字符數據(特征數據)。
DAMILES在網(wǎng)上發(fā)布了一個(gè)應用OpenCV進(jìn)行OCR的例子, http://blog.damiles.com/2008/11/basic-ocr-in-opencv/。
這些例子都只能用于學(xué)習OpenCV或熟悉OCR的簡(jiǎn)單流程,因為它們與當前比較專(zhuān)業(yè)的OCR引擎的識別率相去甚遠。
這里寫(xiě)下OpenCV下OCR的流程:
1. 特征提取
2. 訓練
3. 識別
特征提取
1. 在圖像預處理后,提取出字符相關(guān)的ROI圖像,并且大小歸一化,整個(gè)圖像的像素值序列可以直接作為特征。damiles是直接將整個(gè)字符圖像轉換化為vector向量特征作為特征輸入的。
2. 但直接將整個(gè)圖像作為特征數據維度太高,計算量太大,所以也可以進(jìn)行一些降維處理,減少輸入的數據量。拿到字符的ROI圖像,二值化。將圖像分塊,然后統計每個(gè)小塊中非0像素的個(gè)數,這樣就形成了一個(gè)較小的矩陣,這矩陣就是新的特征了。
UCI就是這么處理,詳見(jiàn)其說(shuō)明http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
OpenCV中letter_recog例子就是使用的其特征數據。
訓練與識別
訓練與識別一般都采用同一種機器學(xué)習方法:
DAMILES應用了KNearest方法,對輸入數據進(jìn)行訓練和識別。
1. 數據輸入:
getData()函數中:
為trainData和trainClasses設置數據。
2. 初始化機器學(xué)習算法,及其訓練
knn=new CvKNearest( trainData, trainClasses, 0, false, K );
trainData, trainClasses數據已得到。
而K是分類(lèi)的數目。
訓練在CvKNearest算法初始化中已經(jīng)完成
3. 識別
獲取識別測試的數據,testData
result=knn->find_nearest(testData,K,0,0,nearest,0);
result為識別的結果。
而OpenCV自帶例子中,提供了boost,mlp,knearest,nbayes,svm,rtrees這些機器學(xué)習方法,進(jìn)行訓練和識別。
處理的步驟和方式都類(lèi)似。
這些例子的識別率不是很高,OCR識別率在90%以上才有較好的使用意義,所以,OCR還需要更多特征和分析方法,來(lái)提高識別率,tesseract是一個(gè)不錯的開(kāi)源OCR引擎。
-------------------
在tesseract最初的字體庫里,一種字體的字符樣本庫包括:94個(gè)字符,8種大小,4種字體(正常,粗體,斜體,斜粗體),每種20個(gè)樣本,共60160個(gè)樣本。
與UIC提供的字體庫不同的是,tesseract提供的是標準印刷體字體庫的識別,而UIC提供是手寫(xiě)體handwriting的特征數據。
數據之美提到,G公司(應該就是google了)的研究結果表明,在自然語(yǔ)言與機器翻譯領(lǐng)域,簡(jiǎn)單模型加上大量有效樣本數據,比復雜模型加上小樣本數據,有效的多。 這個(gè)結論應該適用機器學(xué)習的很多領(lǐng)域。運算足夠快,樣本足夠大,即使簡(jiǎn)單的模型,效果可能會(huì )出人意料。
由此可見(jiàn),收集有效的、大量的樣本庫是多么的重要。
聯(lián)系客服