一、效果
原图
识别:
二、图像变换
2.1 加载原图
var imgO = CvInvoke.Imread("OCR1.png");
var imgO1 = imgO.Clone(); //备用
CvInvoke.Imshow("imgO",imgO);
2.2 转为灰度
var imgGray = CvInvoke.Imread("OCR1.png", 0);
CvInvoke.Imshow("imgGray",imgGray);
2.3 高斯滤波
var imgGaussian = new Mat();
CvInvoke.GaussianBlur(imgGray, imgGaussian, new Size(5, 5), 0);
CvInvoke.Imshow("imgGaussian", imgGaussian);
2.4 canny
var imgCanny = new Mat();
CvInvoke.Canny(imgGaussian,imgCanny,75,200);
CvInvoke.Imshow("imgCanny", imgCanny);
2.5 查找轮廓
// 6. 轮廓检测
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
Mat hierarchy = new Mat();
CvInvoke.FindContours(imgCanny,contours,hierarchy,RetrType.External,ChainApproxMethod.ChainApproxSimple);
// 7. 绘制轮廓
var imgContours = imgO1.Clone();
CvInvoke.DrawContours(imgContours,contours,-1,new MCvScalar(0,0,255),2);
CvInvoke.Imshow("imgContours", imgContours);
2.6 仿射变换
// 9. 近似矩形
var length = CvInvoke.ArcLength(contours[0],true);
VectorOfPoint rec = new VectorOfPoint();
CvInvoke.ApproxPolyDP(contours[0],rec,length*0.01,true);
// 10 . 计算仿射变换矩阵
var w1 = Math.Sqrt(Math.Pow(rec[3].X - rec[0].X, 2) + Math.Pow(rec[3].Y - rec[0].Y, 2));
var w2 = Math.Sqrt(Math.Pow(rec[2].X - rec[1].X, 2) + Math.Pow(rec[2].Y - rec[1].Y, 2));
var maxWidth = Math.Max(w1,w2);
var h1 = Math.Sqrt(Math.Pow(rec[1].X - rec[0].X, 2) + Math.Pow(rec[1].Y - rec[0].Y, 2));
var h2 = Math.Sqrt(Math.Pow(rec[2].X - rec[3].X, 2) + Math.Pow(rec[2].Y - rec[3].Y, 2));
var maxHeight = Math.Max(h1, h2);
PointF[] dst = new PointF[4] { new Point(0, 0), new Point((int)maxWidth - 1, 0), new Point((int)maxWidth - 1, (int)maxHeight - 1), new Point(0, (int)maxHeight - 1) };
PointF[] src = new PointF[4] { rec[0], rec[3], rec[2], rec[1]};
var transform = CvInvoke.GetPerspectiveTransform(src,dst);
var imgTransform = new Mat();
CvInvoke.WarpPerspective(imgO,imgTransform,transform,new Size((int)maxWidth,(int)maxHeight));
CvInvoke.Resize(imgTransform, imgTransform, imgO.Size);
CvInvoke.Imshow("imgTransform", imgTransform);
三、 识别
3.1 安装
3.2 下载语言包
可以去官网下:https://github.com/tesseract-ocr/tessdoc
也可以直接去gitee上搜一下,有很多:
下载完后,将其中的tessdata文件夹放在程运行目录下
3.3 识别
仅需此两行代码,即可识别结果
var ocr = new Tesseract.TesseractEngine("tessdata", "eng", EngineMode.Default);
var text =ocr.Process(imgTransform.Bitmap).GetText();