1. 程式人生 > >OpenCV實現0到9數字識別OCR

OpenCV實現0到9數字識別OCR

使用OpenCV對0到9數字進行識別,實現簡單OCR功能,基於CA(輪廓)分析實現特徵提取,基於L1距離計算匹配實現數字識別。在排除干擾的基礎上,識別精度可以達到98%以上。整個演算法分為兩個部分,第一部分是特徵提取,提取的特徵實現了尺度不變性與輕微光照與變形干擾排除,第二部分基於特徵資料進行匹配實現了相似性比較,最終識別0到9十個數字。

第一部分詳解:

演算法的第一部分主要是實現以下功能,提取42個特徵向量,用其中40個向量做匹配識別,另外兩個向量做輔助檢查。比如0跟1的橫縱比有明顯差別。特徵提取的主要步驟如下: 

1. 影象去噪聲與二值化 2. 輪廓發現與ROI區域分割 3. 水平與垂直投影,提取20個向量,並歸一化 4. 網格分割5x4,提取20個向量,並歸一化 5. 寬高比與空白比,總計42個向量提取完成

預處理通過高斯模糊去噪聲,然後通過全域性閾值實現影象二值化,使用輪廓發現提取ROI矩形區域,對每個區域完成3~5步,實現特徵提取,其中水平與垂直投影演示如下:

對ROI區域的水平與垂直投影分別分成10個BIN,考慮到浮點數劃分,每個BIN長度不一定是整數,這樣就通過權重進行按比例分割畫素點。完成每個BIN的前景畫素點統計。

同樣對數字ROI區域實現5x4的網格分割,每個Cell計算前景畫素個數,也會藉助權重比例進行分割,最終得到歸一化之後的20個特徵向量。

這樣得到的40個特徵向量具有放縮不變性與輕微抗干擾變形能力。

第二部分詳解:

執行截圖:

訓練資料:

輸入資料:

識別結果:

觀察結論

訓練資料和識別資料在字型、大小上均有差異,然而根據提取的特徵進行匹配,均可識別,充分證明了本識別演算法的尺度不變性與區域性抗干擾能力。

執行程式碼

Mat src = imread("D:/vcprojects/images/td1.png");

   if (src.empty()) {

       printf("could not load image...\n");

       return -1;

   }

   namedWindow("input image", CV_WINDOW_AUTOSIZE);

   imshow("input image", src);



   // 訓練

   train_data();

   // 測試

   test_data();

   waitKey(0);

   return 0;