avatar

目录
csharp_test_Tesseract_1

C#使用Tesseract库进行OCR识别

新建项目,添加Tesseract依赖

右击解决方案中的项目名称,选择“管理NuGet程序包”,搜索Tesseract:

图片中第一个即是,点击安装。

设计OCR测试窗体

  • textbox1(多行显示文本框) 展示OCR识别结果
  • textbox2(单行显示)展示用户选择识别文件的路径
  • button1 点击识别
  • button2 浏览,打开文件浏览对话框
  • picturebox1 展示用户选择OCR识别的图片
  • picturebox2 展示加载中动画

业务逻辑

Form1.cs

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tesseract;

namespace ocr_study1
{
public partial class Form1 : Form
{

private String app_path;
private String mode;
private String img_path;

public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
MaximizeBox = false;
FormBorderStyle = FormBorderStyle.FixedSingle;
mode = "prod";
if(mode == "dev")
{
app_path = Application.StartupPath + "\\..\\..";
}
else
{
app_path = Application.StartupPath;
}
}

private void Form1_Load(object sender, EventArgs e)
{
//控件属性配置
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
button1.Text = "OCR识别";
button2.Text = "浏览";
pictureBox2.Image = new Bitmap(app_path + "\\static\\loading.gif");
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.Visible = false;
textBox2.Enabled = false;
label1.Text = "Tesseract库测试";
// 不安全写法,本程序已经确定不同线程不会同时调用同一个控件
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
if(textBox2.Text == "")
{
MessageBox.Show("请选择路径");
return;
}
// 由于识别时间较长,因此开启新线程来执行,防止窗体假死
Thread t1 = new Thread(ocrProcess);
t1.Start(img_path);
}

delegate void MainProcess();

private void ocrProcess(Object img_path)
{
// 展示正在加载...
pictureBox2.Visible = true;
button1.Enabled = false;
button2.Enabled = false;
// 识别调用
var img = new Bitmap((String)img_path); //需要识别的图片
String chi_sim_path = app_path + "\\static\\tessdata";
var ocr = new TesseractEngine(chi_sim_path, "chi_sim", EngineMode.Default); //使用chi_sim中文语言包做测试
var page = ocr.Process(img);
textBox1.Text = page.GetText();
// 识别完毕
pictureBox2.Visible = false;
button1.Enabled = true;
button2.Enabled = true;
}

private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.InitialDirectory = app_path;
//dialog.Filter = "文本文件 (*.txt)|*.txt";//过滤你想设置的文本文件类型(这是txt型)
dialog.Filter = "PNG (*.png)|*.png|All files (*.*)|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
textBox2.Text = Path.GetFullPath(dialog.FileName);//显示文件的名字
img_path = Path.GetFullPath(dialog.FileName);
pictureBox1.Image = new Bitmap(img_path); // 展示一下
}
}
}
}

由于点击识别按钮后,主线程会因识别进入阻塞,窗体会卡死,因此创建了一个新线程用来识别,窗体在识别过程中不会卡死。

测试

F5测试程序:




使用的是中文语言包,直接识别,准确路达到86.4%。

文章作者: Bill
文章链接: http://blog.webpro.ltd/2020/01/14/csharp-test-Tesseract-1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bill's blog

评论