C# OpenCvSharp DNN 极简主义OCR
目录
说明
本OCR程序中,文本检测使用EAST,文本识别使用CRNN。 这两个网络的推理仅依靠opencv的dnn模块实现(理论上说,X86可用,Win7可用!)。
识别内容:0123456789abcdefghijklmnopqrstuvwxyz,不支持中文识别!
参考:https://github.com/hpc203/ocr-opencv-dnn
EAST模型下载链接:https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz?dl=1
CRNN模型下载链接:https://drive.google.com/drive/folders/1cTbQ3nuZG-EKWak6emD_s8_hHXWz7lAr
效果
项目
代码
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace 极简主义OCR
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
OCR ocr;
List<OcrResult> ltOcrResult;
private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Now;
String imgPath;
Mat mat;
Mat resultImg;
private void Form1_Load(object sender, EventArgs e)
{
ocr = new OCR("model/CRNN_VGG_BiLSTM_CTC.onnx", "model/frozen_east_text_detection.pb", "0123456789abcdefghijklmnopqrstuvwxyz");
}
private void btnSelect_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
imgPath = ofd.FileName;
pictureBox1.Image = new Bitmap(imgPath, true); ;
richTextBox1.Clear();
btnSelect.Enabled = false;
button1.Enabled = false;
System.Windows.Forms.Application.DoEvents();
mat = new Mat(ofd.FileName);
resultImg = mat.Clone();
dt1 = DateTime.Now;
ltOcrResult = ocr.detect_rec(mat);
dt2 = DateTime.Now;
ShowOCRResult(ltOcrResult);
btnSelect.Enabled = true;
button1.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
if (imgPath == null)
{
return;
}
richTextBox1.Clear();
btnSelect.Enabled = false;
button1.Enabled = false;
if (pictureBox1.Image!=null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = new Bitmap(mat.ToMemoryStream());
System.Windows.Forms.Application.DoEvents();
resultImg.Dispose();
resultImg = mat.Clone();
dt1 = DateTime.Now;
ltOcrResult = ocr.detect_rec(mat);
dt2 = DateTime.Now;
ShowOCRResult(ltOcrResult);
btnSelect.Enabled = true;
button1.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 显示结果
/// </summary>
private void ShowOCRResult(List<OcrResult> ocrResult)
{
richTextBox1.Clear();
richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");
richTextBox1.AppendText("-----------------------------------\n");
foreach (var item in ocrResult)
{
richTextBox1.AppendText(item.text + "\n");
for (int j = 0; j < 4; ++j)
{
Cv2.Line(resultImg, (OpenCvSharp.Point)item.vertices[j], (OpenCvSharp.Point)item.vertices[(j + 1) % 4], new Scalar(0, 255, 0), 1,LineTypes.AntiAlias);
}
}
if (pictureBox1.Image!=null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = new Bitmap(resultImg.ToMemoryStream());
}
}
}
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace 极简主义OCR
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
OCR ocr;
List<OcrResult> ltOcrResult;
private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Now;
String imgPath;
Mat mat;
Mat resultImg;
private void Form1_Load(object sender, EventArgs e)
{
ocr = new OCR("model/CRNN_VGG_BiLSTM_CTC.onnx", "model/frozen_east_text_detection.pb", "0123456789abcdefghijklmnopqrstuvwxyz");
}
private void btnSelect_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
imgPath = ofd.FileName;
pictureBox1.Image = new Bitmap(imgPath, true); ;
richTextBox1.Clear();
btnSelect.Enabled = false;
button1.Enabled = false;
System.Windows.Forms.Application.DoEvents();
mat = new Mat(ofd.FileName);
resultImg = mat.Clone();
dt1 = DateTime.Now;
ltOcrResult = ocr.detect_rec(mat);
dt2 = DateTime.Now;
ShowOCRResult(ltOcrResult);
btnSelect.Enabled = true;
button1.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
if (imgPath == null)
{
return;
}
richTextBox1.Clear();
btnSelect.Enabled = false;
button1.Enabled = false;
if (pictureBox1.Image!=null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = new Bitmap(mat.ToMemoryStream());
System.Windows.Forms.Application.DoEvents();
resultImg.Dispose();
resultImg = mat.Clone();
dt1 = DateTime.Now;
ltOcrResult = ocr.detect_rec(mat);
dt2 = DateTime.Now;
ShowOCRResult(ltOcrResult);
btnSelect.Enabled = true;
button1.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 显示结果
/// </summary>
private void ShowOCRResult(List<OcrResult> ocrResult)
{
richTextBox1.Clear();
richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");
richTextBox1.AppendText("-----------------------------------\n");
foreach (var item in ocrResult)
{
richTextBox1.AppendText(item.text + "\n");
for (int j = 0; j < 4; ++j)
{
Cv2.Line(resultImg, (OpenCvSharp.Point)item.vertices[j], (OpenCvSharp.Point)item.vertices[(j + 1) % 4], new Scalar(0, 255, 0), 1,LineTypes.AntiAlias);
}
}
if (pictureBox1.Image!=null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = new Bitmap(resultImg.ToMemoryStream());
}
}
}