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