有幸接触到了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识别
成功识别