一、概述
雲貓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日