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>

posted @   Luckyfish小文  阅读(4535)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示