C# OpenCvSharp DNN 极简主义OCR

发布于:2024-05-17 ⋅ 阅读:(103) ⋅ 点赞:(0)

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());
        }

    }
}

下载

源码下载


网站公告

今日签到

点亮在社区的每一天
去签到