C#识别图上的文字
因为编程是业余的,所以写的东西不规范,大家凑合看:
一、准备工作
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分别用来存放图片和识别后的文字,其它不说了,直接看后台主代码:
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 | //引用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.AppendLine(rt.words_result[i].words).ToString(); } } 2、建一个用来解析JSON的辅助类JsonImage.csclass 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 ; } } } |
三、一个简单的识别图片文字程序就完成了,看看效果(标点和文字都能正确识别)
1 | 注:<strong>用AppendLine初步解决了分段问题,但是段落开头未控行,估计还是得用正则,有能力的大神完善下</strong> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)