tesseract+opencv进行验证码识别
程序员文章站
2023-12-27 10:18:15
...
有幸接触到了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识别
成功识别