OpenCV實現0到9數字識別OCR
阿新 • • 發佈:2018-12-09
使用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;