隨着AI技術的發展,圖像識別技術應用越來越廣泛,OCR(Optical Character Recognition,光學字符識別)技術做為圖像識別技術的應用場景之一,廣泛的應用於零售,政務,工業,金融等領域,如車牌號識別,身份證識別等。今天以一個簡單的小例子,簡述在.NET開發中,如何利用第三方OCR組件庫進行圖像文字識別,僅供學習分享使用,如有不足之處,還請指正。
什麼是OCR
OCR (Optical Character Recognition,光學字符識別)是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,通過檢測暗、亮的模式確定其形狀,然後用字符識別方法將形狀翻譯成計算機文字的過程;通俗一點將,OCR技術就是識別圖像上的文本字符內容,進而用於分析或其他用途。
PaddleOCRSharp簡介
PaddleOCR是百度開源的OCR工具庫,基於PaddlePaddle深度學習框架構建,集成了文本檢測、方向分類和文字識別三大核心模塊。其技術架構採用CRNN(卷積循環神經網絡)與DB(Differentiable Binarization)算法的組合,在保持高精度的同時實現高效推理。PaddleOCRSharp是一款C#版的基於百度飛槳OCR進行封裝的文字識別組件,它簡化了PaddleOCR的相關調用,並可以不依賴網絡進行離線識別,並且識別效率和準確率也相當高。

應用實例
首先創建一個WinForm程序,並通過Nuget包管理器安裝PaddleOCRSharp組件,如下所示:

説明:PaddleOCRSharp組件運行時,依賴Paddle.Runtime.win_x64組件,否則無法運行,安裝成功後編譯程序,在輸出目錄下可以看到PaddleOCRSharp引用庫,以及模型文件,主要包含以下三種:
- inference目錄為離線模型文件夾,存放OCR文字識別所需的模型文件。
- Paddle開頭的為OCR識別的依賴庫
- 飛槳OCR技術是基於C++開發的,所以需要C++運行環境。
具體如下所示:

核心代碼
PaddleOCRSharp應用非常簡單,只需要幾行代碼即可實現文字識別,主要包含如下內容:
- 初始化PaddleOCREngine引擎實例對象,此對象可不必每次識別都初始化,可定義為全局變量,只在軟件啓動時進行初始化,頻繁的初始化可能會導致失敗或其他問題。
- 調用實例的DetectText方法即可,此方法接收一個Bitmap類型的圖像實例,並返回一個OCRResult結果。
- 遍歷OCRResult的的TextBlocks屬性,即可獲取所有識別的文本。
具體如下所示:
private void PaddleOcr()
{
OCRModelConfig config = null;
OCRParameter ocrParameter = new OCRParameter();
// 初始化引擎
PaddleOCREngine engine = new PaddleOCREngine(config, ocrParameter);
Bitmap bmp = new Bitmap(this.txtImageFile.Text);
// 調用OCR引擎進行識別
OCRResult ocrResult = engine.DetectText(bmp);
if (ocrResult != null)
{
foreach (var block in ocrResult.TextBlocks)
{
//Console.WriteLine($"文字: {block.Text}");
//Console.WriteLine($"方向: {block.Direction}"); // 輸出文字方向信息
if (string.IsNullOrEmpty(block.Text))
{
continue;
}
this.Invoke(() =>
{
this.txtInfo.AppendText(block.Text + Environment.NewLine);
});
}
}
}
輔助代碼
本實例首先讀取用户選擇的圖片,並顯示到頁面上,代碼如下所示:
private void btnOpen_Click(object sender, EventArgs e)
{
this.txtImageFile.Text = "";
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "圖片PNG|*.png|圖片JPG|*.jpg|圖片JPEG|*.jpeg";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string imageFile = openFileDialog.FileName;
using (Stream fs = new FileStream(imageFile, FileMode.Open))
{
Image image = Image.FromStream(fs);
this.pbImg.Image = image;
}
this.txtImageFile.Text = imageFile;
}
}
圖像識別,調用上述封裝好的PaddleOcr方法,由於PaddleOCR識別時間比較長,避免造成頁面卡頓,採用後台線程處理,並通過IProgress接口更新識別狀態,如下所示:
private void btnRecognize_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtImageFile.Text) || !File.Exists(txtImageFile.Text))
{
MessageBox.Show("請選擇需要識別的圖片");
return;
}
this.txtInfo.Clear();
Task task = Task.Run(() =>
{
this.progress.Report(true);
PaddleOcr();
this.progress.Report(false);
});
}
IProgress接口用於更新UI上識別進度,如下所示:
private IProgress<bool> progress;
private void FrmMain_Load(object sender, EventArgs e)
{
this.progress = new Progress<bool>(UpdteProgressStatus);
}
private void UpdteProgressStatus(bool running)
{
this.Invoke(() =>
{
if (running)
{
this.lblStatus.Text = "進行中";
this.pbRecognizeStatus.Visible = true;
this.lblStatus.ForeColor = Color.Red;
}
else
{
this.lblStatus.Text = "完成";
this.pbRecognizeStatus.Visible = false;
this.lblStatus.ForeColor = Color.Green;
}
});
}
OCR識別效果
上述代碼運行後實例,網上找了一張身份證示例圖片,識別結果如下:

進一步思考
在實際應用中,受限於圖像的清晰度,顏色,大小或其他干擾因素,只靠OCR識別並一定能準確完整的識別出其中的文本,此時可能需要結合其他的計算機視覺開發技術,如灰度,二值化等去噪技術進行預處理,才能提升識別的精確度。
以上就是《推薦一款基於.NET和百度飛槳的OCR識別組件》的全部內容,旨在拋磚引玉,一起學習,共同進步。