因为编程是业余的,所以写的东西不规范,大家凑合看:
一、准备工作
1、dll下载:用的是百度云API,到官网上下载C#SDK http://ai.baidu.com/sdk#ocr,文字识别对应版本:3.6.11 ;解压对应.net版本,在项目引用 以下两个dll;
2、百度云上,利用百度帐号登录Web控制台后,创建生成Access Key ID / Secret Access Key密钥对,下面程序要用到,生成方法可查看官方帮助文档:https://cloud.baidu.com/doc/Reference/s/9jwvz2egb
二、程序开始
1、新建一个窗体,拉入一个pictureBox和textbox分别用来存放图片和识别后的文字,其它不说了,直接看后台主代码:
//引用
using Newtonsoft.Json;
/// <summary>
///定义 apikey,secret key
/// APP_ID = "你的 App ID";
/// API_KEY = "你的 Api Key";
/// SECRET_KEY = "你的 Secret Key";
/// </summary>
public class ApiMessage
{
public const string API_ID = " 省略 ";
public const string API_KEY = "省略";
public const string SECRET_KEY ="省略";
}
/// <summary>
/// 图片上文字识别方式
/// </summary>
/// <param name="imgUrl">图片路径</param>
/// <param name="way">GeneralBasic(普通识别);AccurateBasic(高精度识别)</param>
private void RecognitionWay(string imgUrl,string way)
{
var image = File.ReadAllBytes(imgUrl);
var client = new Baidu.Aip.Ocr.Ocr(ApiMessage.API_KEY, ApiMessage.SECRET_KEY);
client.Timeout = 60000; // 修改超时时间
var result=client.AccurateBasic(image);
// 如果有可选参数
var options = new Dictionary<string, object>{
{"language_type", "CHN_ENG"},//语言
{"detect_direction", "true"},//图片方向
{"probability", "true"}//图片识别成功可能性
};
// 带参数调用通用文字识别,识别方式有很多种,我只是取了其中常用的两种,其它方式可以查看官网帮助文档
switch(way)
{
case"AccurateBasic":
result = client.AccurateBasic(image, options);
break;
case"GeneralBasic":
result = client.GeneralBasic(image, options);
break;
}
string getJson = result.ToString();
//关键:result返回的是一个一串Json格式的数据,具体大家可以单独输出查看;
//所以要解析这个JSON,还需一个帮助类JsonImage,然后用JSON反序列化,最后StringBuilder拼接
JsonImage.Root rt = JsonConvert.DeserializeObject<JsonImage.Root>(getJson);//JSON反序列化
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rt.words_result.Count; i++)
{
textBox1.Text = sb.Append(rt.words_result[i].words).ToString();
}
}
2、建一个用来解析JSON的辅助类JsonImage.cs
class JsonImage
{
public class Probability
{
/// <summary>
///
/// </summary>
public double variance { get; set; }
/// <summary>
///
/// </summary>
public double average { get; set; }
/// <summary>
///
/// </summary>
public double min { get; set; }
}
public class Words_resultItem
{
/// <summary>
/// 精确识别图片上的文字
/// </summary>
public string words { get; set; }
/// <summary>
///
/// </summary>
public Probability probability { get; set; }
}
public class Root
{
/// <summary>
///
/// </summary>
public Int64 log_id { get; set; }
/// <summary>
///
/// </summary>
public int direction { get; set; }
/// <summary>
///
/// </summary>
public int words_result_num { get; set; }
/// <summary>
///
/// </summary>
public List<Words_resultItem> words_result { get; set; }
}
}
三、一个简单的识别图片文字程序就完成了,看看效果(标点和文字都能正确识别,但不能分段落)