C#使用Tesseract
前言
上篇文章讲述了 Tesseract-orc的安装和使用,这片文章讲一讲在net平台上面如何使用 Tesseract-orc 没有那么复杂的安装教程。
我在使用的时间还是基于Framework ,在网上下载了好多dll文件,浪费我的cdsn积分,最后还是没有成功,最终自己摸索到方法了。
什么是tesseract?
Tesseract 最初由惠普实验室支持,用于电子版文字识别,1996年被移植到Windows上,1998年进行了C++化,在2005年Tesseract由惠普公司宣布开源。 2006年到现在,由Google公司维护开发。
Net5中的使用
在’Netget’包中直接引用Tesseract
,就会生成leptonica-1.80.0.dll'
和tesseract41.dll
一般项目适合orc一起使用的
问题:
解决办法
安装运行时Emgu.CV.runtime.windows
主要依靠 直接返回文字。
//调用tesseract实现OCR识别
public static string ImageToText(string imgPath)
{
using (var engine = new TesseractEngine("tessdata", "chi_sim", EngineMode.Default))
{
using (var img = Pix.LoadFromFile(imgPath))
{
using (var page = engine.Process(img))
{
return page.GetText();
}
}
}
}
完整代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog of = new OpenFileDialog();
of.Title = "请选择图片";
if (of.ShowDialog() == DialogResult.OK)
{
string file = of.FileName;
Image img = Image.FromFile(file);
pictureBox1.Image = img;
}
Bitmap bitmap = (Bitmap)this.pictureBox1.Image;
var path = $"{ DateTime.Now.ToString("yyyyMM")}.jpg";
bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);
Image<Bgr, Byte> imageSource = new Image<Bgr, byte>(path);
Image<Gray, Byte> imageGrayscale = imageSource.Convert<Gray, Byte>();
imageGrayscale = randon(imageGrayscale);
imageThreshold = imageGrayscale.ThresholdBinary(new Gray(100), new Gray(255));
this.pictureBox2.Image = imageThreshold.ToBitmap();
this.pictureBox2.Image.Save(path);
//识别照片
this.label1.Text = ImageToText(path);
}
Image<Gray, Byte> imageThreshold;
//调用tesseract实现OCR识别
public static string ImageToText(string imgPath)
{
using (var engine = new TesseractEngine("tessdata", "chi_sim", EngineMode.Default))
{
using (var img = Pix.LoadFromFile(imgPath))
{
using (var page = engine.Process(img))
{
return page.GetText();
}
}
}
}
/// <summary>
/// 旋转校正
/// </summary>
/// <param name="imageInput"></param>
/// <returns></returns>
private Image<Gray, Byte> randon(Image<Gray, Byte> imageInput)//图像投影旋转法倾斜校正子函数定义
{
int nwidth = imageInput.Width;
int nheight = imageInput.Height;
int sum;
int SumOfCha;
int SumOfChatemp = 0;
int[] sumhang = new int[nheight];
Image<Gray, Byte> resultImage = imageInput;
Image<Gray, Byte> ImrotaImage;
//20度范围内的调整
for (int ang = -20; ang < 20; ang = ang + 1)
{
ImrotaImage = imageInput.Rotate(ang, new Gray(1));
for (int i = 0; i < nheight; i++)
{
sum = 0;
for (int j = 0; j < nwidth; j++)
{
sum += ImrotaImage.Data[i, j, 0];
}
sumhang[i] = sum;
}
SumOfCha = 0;
for (int k = 0; k < nheight - 1; k++)
{
SumOfCha = SumOfCha + (Math.Abs(sumhang[k] - sumhang[k + 1]));
}
if (SumOfCha > SumOfChatemp)
{
resultImage = ImrotaImage;
SumOfChatemp = SumOfCha;
}
}
return resultImage;
}
}