先进行一下效果展示:
!!!记得先到Nuget中添加Baidu.AI的拓展包并且添加三个引用:
using Newtonsoft.Json.Linq;
using Baidu.Aip.Ocr;
using System.IO;
接下来是代码解析:
1.UI设计
按下上传按钮加载一张图片到预览框内:
预览框由一个图片控件组成,在按下上传按钮时将指定路径的图片加载为图片模式且将控件的数据源切换为此图片,同时用全局变量ImgPath来记录所获取的文件位置(懒得做接口了)
OpenFileDialog FileImg = new OpenFileDialog();
FileImg.ShowDialog();
ImgPath = FileImg.FileName;
ImgShow.Image = Image.FromFile(FileImg.FileName);
2.识别
原理是将图片转换为二进制流传输到百度AI然后返回一段JSON给程序,百度官方提供了很多方法可供选择,包括手写体识别和一些特殊文件如身份证等。
百度AI的官网如下:百度AI开放平台-全球领先的人工智能服务平台
if (ImgPath == "")
MessageBox.Show("请先选择图片", "提醒");
Ocr client = new Ocr(apiKey, secretKey)
{
Timeout = 30000//延时时间
};
try
{
byte[] image = File.ReadAllBytes(ImgPath);//需要识别的图片路径
JObject result = new JObject();
result = client.GeneralBasic(image);//打印体标准识别
//result = client.Handwriting(image);//手写
List<string> WordsList = AnayJson(result.Last.ToString());
//此段代码需要修改,见下文
foreach (var item in WordsList)
{
string Template = item + "\r\n";
txtDetail.Text += Template;
}
}
catch (Exception)
{
MessageBox.Show("出现了意料之外的错误", "提示:");
}
其中:apiKey和secretKey为你自己的API接口(可定义为全局变量方便使用)
返回的JSON字符串对象结构如下
可见我们需要的数据为result.Last中的数据,Json格式格式大致如下:
由于我不太想去构建用于Json结构的数据模型(还是懒),于是在这里采用了手写的算法。
由图我们不难看出用 " 号将数据切割开来即可得出一个个单独的对象,将这些数据悉数填充到泛型集合中
然后检查泛型集合中的": ",再获取": "的下一个元素即可得到所识别到的语句
获取到的string集合如下:
List<string> AnayJson(string Origin)
{
string[] StringArray = Origin.Split('"'); //按照“ ”进行切割
List<string> WordsList = new List<string>();
for (int i = 0; i < StringArray.Length; i++)
{
if (StringArray[i] == ": ")
{
string TemplateStr = StringArray[i + 1];
TemplateStr.Replace("\"", "");
WordsList.Add(TemplateStr);
}
}
return WordsList;
}
将解析完成的泛型集合返回给主程序即可完成一次文字识别了
最后放一张证件测试的图片,效果出乎意料的好
----------------------------------------------------------------分割线--------------------------------------------------------
2022年7月28日订正
由于百度修改了数据协议,需要将reslut.Last.ToString()修改为reslutToString()
if (ImgPath == "")
MessageBox.Show("请先选择图片", "提醒");
Ocr client = new Ocr(apiKey, secretKey)
{
Timeout = 30000//延时时间
};
try
{
byte[] image = File.ReadAllBytes(ImgPath);//需要识别的图片路径
JObject result = new JObject();
result = client.GeneralBasic(image);//打印体标准识别
//result = client.Handwriting(image);//手写
List<string> WordsList = AnayJson(result.ToString());
foreach (var item in WordsList)
{
string Template = item + "\r\n";
txtDetail.Text += Template;
}
}
catch (Exception)
{
MessageBox.Show("出现了意料之外的错误", "提示:");
}
同时在使用中出现了大批量访问超限的问题,建议在识别的时候加个延迟,避免段时间大量访问被ban的情况(土豪请充钱随意)
foreach (var item in objOpen.FileNames)
{
Temp.Add(GoToOCR(item.ToString()));
Thread.Sleep(5000);//防止过快访问
}
同时现百度AI需要实名认证之后送每月1000次的免费识别套餐,实测并不需要费用
同时上传了最新的测试Demo,各位小伙伴可以用来学习