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
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);
}
}
///
/// 显示结果
///
private void ShowOCRResult(List
{
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());
- }
-
- }
- }
下载


评论记录:
回复评论: