今天心血來(lái)潮做了個(gè)識別圖片文字的demo,現在文字識別技術(shù)已經(jīng)比較成熟了,而且還有可以調用的公共接口。
今天做的demo主要簡(jiǎn)單對比了Tesseract-OCR和BAIDU.AI 這兩種方法,感覺(jué)百度的中文識別準確率更高,Tesseract-OCR中文別準確率較差,需要自己訓練詞庫,這個(gè)比較麻煩。所以demo主要介紹調用百度AI接口實(shí)現文字提取。
那就開(kāi)始吧。
首先,你得去官網(wǎng)(https://ai.baidu.com/)申請調用所需要的AppID以及API Key,這是調用憑證。
創(chuàng )建你的應用,按需填寫(xiě)(隨便填就行),提交后系統會(huì )給你生成所需要的調用憑證。
之后就是創(chuàng )建Demo項目了,這里就不再贅述了,現在做的demo是winform項目。項目新建好了就可以增加接口的SKD了,在項目-->管理Nuget程序包,在瀏覽頁(yè)上搜索 baidu.ai,安裝這個(gè)
安裝完后,你會(huì )發(fā)現在項目的引用下已經(jīng)引用了 AipSdk 這個(gè)dll。
新建一個(gè)窗體吧,并加入些需要的控件
我們通過(guò)【選擇圖片】來(lái)選擇要識別的圖片,然后點(diǎn)擊【提取】按鈕,識別圖片上的文字。
首先附上【選擇圖片】按鈕的代碼:
就是這么簡(jiǎn)單,這時(shí)會(huì )把圖片的完整路徑放在一個(gè)textbox里,接下來(lái)看看【提取】功能的實(shí)現,識別到的結果會(huì )保存在richTextBox里。


就是這么簡(jiǎn)單了。其實(shí)別看我們調用接口實(shí)現功能這么簡(jiǎn)單,識別文字的接口開(kāi)發(fā)可不是這么簡(jiǎn)單。程序跑起來(lái)看看效果吧。

攝像機拍攝的圖片,識別出來(lái)了,完美。再手寫(xiě)體看看

寫(xiě)好點(diǎn)還是可以識別出來(lái)的


這種寫(xiě)得潦草一點(diǎn)的通用文字識別接口(ocr.GeneralBasic(bt, ops) 就是這個(gè)方法)可能就會(huì )識別不準確了,還是要訓練字庫。
對于識別不出來(lái)或是識別不準確的可以試一下高精度的接口方法(就是把上面的方法ocr.GeneralBasic(bt, ops) 換成ocr.AccurateBasic(bt,ops)),API上說(shuō)提供了好幾種方法,根據需要調用不同的方法吧。

各種證件圖片都是可以識別出來(lái)的,大家可以試試就不一一貼圖了。
代碼:
using Baidu.Aip.Ocr;using Newtonsoft.Json.Linq;using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApp20{ public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { try { OpenFileDialog of = new OpenFileDialog(); of.Filter = "圖片(*.png;*.jpg;*.bmp;*.jpeg)|*.png;*.jpg;*.bmp;*.jpeg"; if (of.ShowDialog() == DialogResult.OK) { richTextBox1.Text = of.FileName; } } catch (Exception ex) { MessageBox.Show("選擇圖片出錯", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
}
private void button2_Click(object sender, EventArgs e) { try { richTextBox2.Text = string.Empty; var imagePath = richTextBox1.Text; if (string.IsNullOrEmpty(imagePath)) { MessageBox.Show("請選擇圖片文件", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Stream s = File.Open(imagePath, FileMode.Open); pictureBox1.Image = Image.FromStream(s); s.Close(); s.Dispose();
var apiKey = "你申請的Key"; var apiSecretKey = "你申請的SecretKey"; Ocr ocr = new Ocr(apiKey, apiSecretKey) { Timeout = 6000 }; byte[] bt = File.ReadAllBytes(imagePath);
#region 參數可空,全部默認也行 Dictionary<string, object> ops = new Dictionary<string, object>(); ops.Add("language_type", "CHN_ENG");//識別語(yǔ)言類(lèi)型,默認為CHN_ENG ops.Add("paragraph", true);//是否輸出段落信息 #endregion
JObject jobject = ocr.GeneralBasic(bt,ops);//返回值是json類(lèi)型 if(jobject.Count > 0) { JArray jo = (JArray)jobject["words_result"]; if(jo.Count > 0) { for(int i=0;i<jo.Count;i++) { richTextBox2.Text += jo[i]["words"].ToString() + Environment.NewLine; } } } } catch(Exception ex) { MessageBox.Show(ex.Message,"error",MessageBoxButtons.OK,MessageBoxIcon.Error); } }
}}
聯(lián)系客服