tesseract+opencv進行驗證碼識別
阿新 • • 發佈:2019-02-12
有幸接觸到了tesseract,然後上網找了張驗證碼,直接扔給tesseract識別,發現識別不了,如下圖
於是使用opencv進行處理之後再用tesseract識別,結果如下圖
首先讀入圖片
Mat src = imread("test.png");
if (src.empty())
return -1;
imshow("src", src);
灰度轉換
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
二值化
//二值化 Mat binaryMat; threshold(~gray, binaryMat, 100, 255, THRESH_OTSU); Mat verticalMat; binaryMat.copyTo(verticalMat);
然後想著現在這張圖能不能識別了,於是把二值化之後的圖片甩給tesseract識別,發現還是識別不了
進行形態學操作
//定義形態學運算元 int verticalSize = verticalMat.rows / 30; Mat verticalKernel = getStructuringElement(MORPH_RECT, Size(1, verticalSize)); erode(verticalMat, verticalMat, verticalKernel); dilate(verticalMat, verticalMat, verticalKernel);
查詢輪廓,根據輪廓大小篩選,去除一些小的噪聲
//尋找輪廓 vector<vector<Point>>contours; vector<vector<Point>>detectorContours; findContours(verticalMat, contours, RETR_LIST, CHAIN_APPROX_SIMPLE); for (int i = 0;i < contours.size();i++) { //預設輪廓較大的是驗證碼 if (contours[i].size() > 50) detectorContours.push_back(contours[i]); } Mat printMat = Mat::zeros(src.size(),CV_8UC1); drawContours(printMat, detectorContours, -1, Scalar::all(255),-1);
現在應該差不多了,甩給tesseract識別
成功識別