本節的代碼能夠經過此處進行下載。git
首先看驗證碼的樣子,
github
能夠看到這幾個驗證碼最大的特色就是字母比較深,而周圍的背景很淺,把圖像轉換成黑白顏色,能夠顯示的更加的明顯。
spa
//按黑白讀取圖像 Mat mat = imread("test1.jpg", 0); cv::imshow("initial_mat", mat); cv::waitKey(0);
能夠看到全部背景的灰度值,都會小於字母的灰度值,爲了讓tesseract更準確的識別,能夠把圖像進行二值化,也就是把背景都改爲純白色,把字母都搞成純黑色。那麼如何肯定分割的閾值呢?比較好的方法是畫出圖像的直方圖。
code
//畫出直方圖 Histogram1D histogram1d; cv::imshow("histogram1d", histogram1d.getHistogramImage(mat)); cv::waitKey(0);
直方圖的橫座標表明灰度值,縱座標表明指定灰度值的點數。圖片
接下來,開始對圖像進行閾值,這裏選擇的灰度值位150,灰度下於150的設置爲白色,灰度大於150的設置爲黑色。ip
//閾值 Mat threshold_mat; cv::threshold(mat, threshold_mat, 150, 255, cv::THRESH_BINARY); cv::imshow("threshold_mat", threshold_mat); cv::waitKey(0);
把圖片進行閾值後,就能夠進行識別了,直接調用tesseract的API就行了。rem
//使用tesseract識別 char buffer[255]; OCRDecoder decoder; decoder.decodeGrayMat(threshold_mat, buffer); cout<<"result:"<<buffer<<endl;
運行程序,能夠看到識別出告終果:
get