基於百度AI的雲貓OCR開發實錄之代碼篇

一、概述

   雲貓OCR是基於百度AI,在Windows平臺運行的一款軟件。我是用C#語言在Visual Studio2017集成開發環境中進行開發的,開發方式是SDK包開發。在開發中,我們需要參考百度的技術文檔。

百度雲文字識別技術文檔地址:https://cloud.baidu.com/doc/OCR/index.html

二、準備工作

首先,我們需要下載最新的百度文字識別的SDK包。

C# SDK包的下載地址如下:http://ai.baidu.com/sdk#ocr

下載完畢後解壓縮,最新的包在文件夾net45裏面。

打開Visual Studio2017開發環境,選擇新建項目,因爲我打算用控制檯項目講解,因此要選擇新建項目——C#控制檯項目。建好項目之後,需要在項目中引用上面下載的SDK包。

三、核心代碼講解

(一)調用百度OCR函數識別圖片文字,返回的格式爲Json

代碼如下:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;

namespace myOCRDemo
{
    class Program
    {
        public static void GeneralBasicDemo()
        {
            // 設置APPID/AK/SK
            var API_KEY = "你的 Api Key";
            var SECRET_KEY = "你的 Secret Key";
            //創建對象
            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超時時間
            var image = File.ReadAllBytes("圖片文件路徑");
            // 調用通用文字識別, 圖片參數爲本地圖片,可能會拋出網絡等異常,請使用try/catch捕獲
            var result = client.GeneralBasic(image);
            Console.WriteLine(result);
        }
        static void Main(string[] args)
        {
            GeneralBasicDemo();
            Console.Read();
        }
    }
}

注意,具體開發的時候要把上面的API Key和Secret Key分別改爲你自己的,至於怎麼申請和查看這兩個Key,可以參考我寫的評測篇帖子。帖子鏈接如下:http://ai.baidu.com/forum/topic/show/955989

另外不要忘了把圖片文件路徑改爲你自己的圖片路徑。下面是識別的結果示例:

原圖如下:

(二)解析Json格式,把識別結果轉變爲更爲直觀的文本類型

代碼如下:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;

namespace myOCRDemo
{
    class Program
    {
        public static void GeneralBasicDemo()
        {
            // 設置APPID/AK/SK
            var API_KEY = "你的Akey";
            var SECRET_KEY = "你的SKey";
            //創建對象
            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超時時間
            var image = File.ReadAllBytes(@"你的圖片路徑");
            // 調用通用文字識別, 圖片參數爲本地圖片,可能會拋出網絡等異常,請使用try/catch捕獲
            var result = client.GeneralBasic(image);
            //解析Json的代碼
            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());
            int num = (int)jo["words_result_num"];
            string[] words = new string[num];
            for (int i = 0; i < num; i++)
                words[i] = jo["words_result"][i]["words"].ToString();
            //返回值
            string txtOCR = null;
            for (int i = 0; i < num; i++)
                txtOCR += words[i] + "\n";
            //顯示結果
            Console.WriteLine(txtOCR);
        }
        static void Main(string[] args)
        {
            GeneralBasicDemo();
            Console.Read();
        }
    }
}

程序運行結果如下:

這樣就比較符合人類的閱讀習慣了,上面這段代碼也是核心的基礎代碼,可以通過這些核心的代碼去做一些優化,比如自動換行、自動縮進、根據語言習慣自動改變標點符號等等。

(三)表格識別

百度的表格文字識別的編程較爲麻煩,主要分成兩步:第一步是提交表格文字識別請求,獲得requestId;第二步是根據requestId獲取表格文字識別的結果,默認是Excel文件格式,Json結果會返回一段下載地址。

我的程序除了上面這兩步以外,還添加了自動下載Excel文件到本地電腦的代碼,供各位參考。另外要注意的是,提交識別請求和獲得識別結果這兩步之間,程序必須設置延時,否則不能獲得下載的URL 。經過實際測試,延時爲3秒較爲合適,3秒以下可能會出錯。

代碼如下:

/// <summary>
        /// 表格文字識別
        /// </summary>
        public static void myTableRecognitionRequestDemo()
        {
            // 設置APPID/AK/SK
            var API_KEY = "你的API Key";
            var SECRET_KEY = "你的Secret Key";
            //創建對象
            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超時時間
            var image = File.ReadAllBytes(@"F:\表格圖片1.jpg");//這裏要改成你的表格圖片路徑
            // 調用表格文字識別,可能會拋出網絡等異常,請使用try/catch捕獲
            var result = client.TableRecognitionRequest(image);
            //解析Json
            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());
            string requestId = jo["result"][0]["request_id"].ToString();
            Console.WriteLine("獲得requestId:"+requestId);
            //延時3秒,這句是必須的
            System.Threading.Thread.Sleep(3000);
            //獲取表格識別結果
            //有時會得不到鏈接,需要多嘗試幾次
            var resultExcel = client.TableRecognitionGetResult(requestId);
            Console.WriteLine("獲得的表格識別結果如下:");
            Console.WriteLine(resultExcel);
            //解析Json,獲得鏈接
            JObject joResult = (JObject)JsonConvert.DeserializeObject(resultExcel.ToString());
            string excelURL = joResult["result"]["result_data"].ToString();
            Console.WriteLine("獲得的Excel文件下載地址是:\n" + excelURL);
            //自動下載Excel文件到電腦
            WebClient df = new WebClient();
            df.DownloadFile(excelURL, @"F:\識別結果.xls");//這裏要改成你的下載文件路徑
            Console.WriteLine("下載完畢");
        }

作者使用的測試用圖片:

表格文字識別結果截圖:

尾記:本文的示例代碼都是最新的代碼,跟百度SDK文檔裏面的代碼是一致的,而云貓OCR是2017年末就已經寫好的了,代碼有些陳舊,所以沒直接貼源代碼了。希望各位看官踊躍討論,本人水平也一般,大家多交流學習。

                                                                                                                                                                                               2019年9月11日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章