当前位置: 首页 > backend >正文

PP-OCRv5

目录

PP-OCRv5官方效果如下

C++封装、C#调用效果

项目

代码

下载 


PP-OCRv5官方效果如下

C++封装、C#调用效果

项目

代码

using Newtonsoft.Json;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace OCRV5Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        const string DllName = "lw.PPOCRSharp.dll";

        //初始化
        [DllImport(DllName, EntryPoint = "init", CallingConvention = CallingConvention.StdCall)]
        public extern static int init(ref IntPtr engine
            , int cpu_threads
            , bool enable_mkldnn

            , string det_model_dir
            , int limit_side_len
            , double det_db_thresh
            , double det_db_box_thresh
            , double det_db_unclip_ratio
            , bool use_dilation

            , bool cls
            , bool use_angle_cls
            , string cls_model_dir
            , double cls_thresh
            , double cls_batch_num

            , string rec_model_dir
            , string rec_char_dict_path
            , int rec_batch_num
            , int rec_img_h
            , int rec_img_w

            , StringBuilder msg);

        //识别
        [DllImport(DllName, EntryPoint = "ocr", CallingConvention = CallingConvention.StdCall)]
        public extern static int ocr(IntPtr engine, IntPtr image, StringBuilder msg, out IntPtr ocr_result, out int ocr_result_len);

        //释放
        [DllImport(DllName, EntryPoint = "destroy", CallingConvention = CallingConvention.StdCall)]
        public extern static int destroy(IntPtr engine, StringBuilder msg);

        static IntPtr OCREngine;

        private Bitmap bmp;

        private String imgPath = null;

        private List<OCRResult> ltOCRResult;

        private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tif;*.png";

        private StringBuilder OCRResultInfo = new StringBuilder();
        private StringBuilder OCRResultAllInfo = new StringBuilder();

        Pen pen = new Pen(Brushes.Red, 2f);

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                imgPath = ofd.FileName;
                bmp = new Bitmap(imgPath);
                pictureBox1.Image = bmp;
                richTextBox1.Clear();

                button2_Click(null, null);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {

            if (imgPath == null)
            {
                return;
            }
            button1.Enabled = false;
            button2.Enabled = false;
            richTextBox1.Clear();
            OCRResultInfo.Clear();
            OCRResultAllInfo.Clear();

            Application.DoEvents();

            Mat img = new Mat(imgPath);
            StringBuilder msgTemp = new StringBuilder(128);
            StringBuilder ocrResultStr = new StringBuilder(1024 * 100);

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            IntPtr strPtr;
            int ocr_result_len = 0;

            int res = ocr(OCREngine, img.CvPtr, msgTemp, out strPtr, out ocr_result_len);
            byte[] buffer = new byte[ocr_result_len];
            Marshal.Copy(strPtr, buffer, 0, ocr_result_len);
            string ocr_result = Encoding.UTF8.GetString(buffer);
            Marshal.FreeCoTaskMem(strPtr);
            //Console.WriteLine(ocr_result);
            stopwatch.Stop();
            double totalTime = stopwatch.Elapsed.TotalSeconds;

            OCRResultAllInfo.AppendLine($"耗时: {totalTime:F2}s");
            OCRResultAllInfo.AppendLine("---------------------------");

            OCRResultInfo.AppendLine($"耗时: {totalTime:F2}s");
            OCRResultInfo.AppendLine("---------------------------");

            if (res == 0)
            {

                ltOCRResult = Newtonsoft.Json.JsonConvert.DeserializeObject<List<OCRResult>>(ocr_result);
                OCRResultAllInfo.Append(JsonConvert.SerializeObject(ltOCRResult, Newtonsoft.Json.Formatting.Indented));
                Graphics graphics = Graphics.FromImage(bmp);

                foreach (OCRResult item in ltOCRResult)
                {
                    OCRResultInfo.AppendLine(item.text);
                    System.Drawing.Point[] pt = new System.Drawing.Point[] {
                              new System.Drawing.Point(item.x1, item.y1)
                            , new System.Drawing.Point(item.x2, item.y2)
                            , new System.Drawing.Point(item.x3, item.y3)
                            , new System.Drawing.Point(item.x4, item.y4)
                        };
                    graphics.DrawPolygon(pen, pt);
                }
                graphics.Dispose();

                if (checkBox1.Checked)
                {
                    richTextBox1.Text = OCRResultAllInfo.ToString();
                }
                else
                {
                    richTextBox1.Text = OCRResultInfo.ToString();
                }

                pictureBox1.Image = null;
                pictureBox1.Image = bmp;
            }
            else
            {
                MessageBox.Show("识别失败," + msgTemp.ToString());
            }

            img.Release();
            button1.Enabled = true;
            button2.Enabled = true;
        }

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            radioButton1.Checked = true;
        }

        void LoadModel()
        {

            StringBuilder msgTemp = new StringBuilder(128);
            string root_dir = Application.StartupPath + @"\inference";

            int cpu_threads = Environment.ProcessorCount + 2;
            bool enable_mkldnn = true;

            string det_model_dir = "";
            int limit_side_len = 960;
            double det_db_thresh = 0.3;
            double det_db_box_thresh = 0.6;
            double det_db_unclip_ratio = 1.2;
            bool use_dilation = false;

            bool cls = false;
            bool use_angle_cls = true;
            string cls_model_dir = root_dir + @"\ch_ppocr_mobile_v2.0_cls_infer\";
            double cls_thresh = 0.9;
            int cls_batch_num = 1;

            string rec_model_dir = "";
            string rec_char_dict_path = root_dir + @"\ppocrv5_dict.txt";
            int rec_batch_num = Environment.ProcessorCount;
            int rec_img_h = 48;
            int rec_img_w = 320;

            if (radioButton1.Checked)
            {
                det_model_dir = root_dir + @"\PP-OCRv5_mobile_det_infer\";
                rec_model_dir = root_dir + @"\PP-OCRv5_mobile_rec_infer\";
            }
            else
            {
                det_model_dir = root_dir + @"\PP-OCRv5_server_det_infer\";
                rec_model_dir = root_dir + @"\PP-OCRv5_server_rec_infer\";
            }
            int res = init(ref OCREngine
                        , cpu_threads
                        , enable_mkldnn

                        , det_model_dir
                        , limit_side_len
                        , det_db_thresh
                        , det_db_box_thresh
                        , det_db_unclip_ratio
                        , use_dilation

                        , cls
                        , use_angle_cls
                        , cls_model_dir
                        , cls_thresh
                        , cls_batch_num

                        , rec_model_dir
                        , rec_char_dict_path
                        , rec_batch_num
                        , rec_img_h
                        , rec_img_w

                        , msgTemp);

            if (res == 0)
            {
                MessageBox.Show("模型加载成功!");
            }
            else
            {
                string msg = msgTemp.ToString();
                MessageBox.Show("模型加载失败," + msg);
            }
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            if (checkBox1.Checked)
            {
                richTextBox1.Text = OCRResultAllInfo.ToString();
            }
            else
            {
                richTextBox1.Text = OCRResultInfo.ToString();
            }
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = sender as RadioButton;
            if (rb != null && rb.Checked)
            {
                //MessageBox.Show("选中的是:" + rb.Text);
                LoadModel();
            }
        }
    }


}
 

using Newtonsoft.Json;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace OCRV5Test
{public partial class Form1 : Form{public Form1(){InitializeComponent();}const string DllName = "lw.PPOCRSharp.dll";//初始化[DllImport(DllName, EntryPoint = "init", CallingConvention = CallingConvention.StdCall)]public extern static int init(ref IntPtr engine, int cpu_threads, bool enable_mkldnn, string det_model_dir, int limit_side_len, double det_db_thresh, double det_db_box_thresh, double det_db_unclip_ratio, bool use_dilation, bool cls, bool use_angle_cls, string cls_model_dir, double cls_thresh, double cls_batch_num, string rec_model_dir, string rec_char_dict_path, int rec_batch_num, int rec_img_h, int rec_img_w, StringBuilder msg);//识别[DllImport(DllName, EntryPoint = "ocr", CallingConvention = CallingConvention.StdCall)]public extern static int ocr(IntPtr engine, IntPtr image, StringBuilder msg, out IntPtr ocr_result, out int ocr_result_len);//释放[DllImport(DllName, EntryPoint = "destroy", CallingConvention = CallingConvention.StdCall)]public extern static int destroy(IntPtr engine, StringBuilder msg);static IntPtr OCREngine;private Bitmap bmp;private String imgPath = null;private List<OCRResult> ltOCRResult;private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tif;*.png";private StringBuilder OCRResultInfo = new StringBuilder();private StringBuilder OCRResultAllInfo = new StringBuilder();Pen pen = new Pen(Brushes.Red, 2f);private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = fileFilter;if (ofd.ShowDialog() == DialogResult.OK){imgPath = ofd.FileName;bmp = new Bitmap(imgPath);pictureBox1.Image = bmp;richTextBox1.Clear();button2_Click(null, null);}}private void button2_Click(object sender, EventArgs e){if (imgPath == null){return;}button1.Enabled = false;button2.Enabled = false;richTextBox1.Clear();OCRResultInfo.Clear();OCRResultAllInfo.Clear();Application.DoEvents();Mat img = new Mat(imgPath);StringBuilder msgTemp = new StringBuilder(128);StringBuilder ocrResultStr = new StringBuilder(1024 * 100);Stopwatch stopwatch = new Stopwatch();stopwatch.Start();IntPtr strPtr;int ocr_result_len = 0;int res = ocr(OCREngine, img.CvPtr, msgTemp, out strPtr, out ocr_result_len);byte[] buffer = new byte[ocr_result_len];Marshal.Copy(strPtr, buffer, 0, ocr_result_len);string ocr_result = Encoding.UTF8.GetString(buffer);Marshal.FreeCoTaskMem(strPtr);//Console.WriteLine(ocr_result);stopwatch.Stop();double totalTime = stopwatch.Elapsed.TotalSeconds;OCRResultAllInfo.AppendLine($"耗时: {totalTime:F2}s");OCRResultAllInfo.AppendLine("---------------------------");OCRResultInfo.AppendLine($"耗时: {totalTime:F2}s");OCRResultInfo.AppendLine("---------------------------");if (res == 0){ltOCRResult = Newtonsoft.Json.JsonConvert.DeserializeObject<List<OCRResult>>(ocr_result);OCRResultAllInfo.Append(JsonConvert.SerializeObject(ltOCRResult, Newtonsoft.Json.Formatting.Indented));Graphics graphics = Graphics.FromImage(bmp);foreach (OCRResult item in ltOCRResult){OCRResultInfo.AppendLine(item.text);System.Drawing.Point[] pt = new System.Drawing.Point[] {new System.Drawing.Point(item.x1, item.y1), new System.Drawing.Point(item.x2, item.y2), new System.Drawing.Point(item.x3, item.y3), new System.Drawing.Point(item.x4, item.y4)};graphics.DrawPolygon(pen, pt);}graphics.Dispose();if (checkBox1.Checked){richTextBox1.Text = OCRResultAllInfo.ToString();}else{richTextBox1.Text = OCRResultInfo.ToString();}pictureBox1.Image = null;pictureBox1.Image = bmp;}else{MessageBox.Show("识别失败," + msgTemp.ToString());}img.Release();button1.Enabled = true;button2.Enabled = true;}/// <summary>/// 初始化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){radioButton1.Checked = true;}void LoadModel(){StringBuilder msgTemp = new StringBuilder(128);string root_dir = Application.StartupPath + @"\inference";int cpu_threads = Environment.ProcessorCount + 2;bool enable_mkldnn = true;string det_model_dir = "";int limit_side_len = 960;double det_db_thresh = 0.3;double det_db_box_thresh = 0.6;double det_db_unclip_ratio = 1.2;bool use_dilation = false;bool cls = false;bool use_angle_cls = true;string cls_model_dir = root_dir + @"\ch_ppocr_mobile_v2.0_cls_infer\";double cls_thresh = 0.9;int cls_batch_num = 1;string rec_model_dir = "";string rec_char_dict_path = root_dir + @"\ppocrv5_dict.txt";int rec_batch_num = Environment.ProcessorCount;int rec_img_h = 48;int rec_img_w = 320;if (radioButton1.Checked){det_model_dir = root_dir + @"\PP-OCRv5_mobile_det_infer\";rec_model_dir = root_dir + @"\PP-OCRv5_mobile_rec_infer\";}else{det_model_dir = root_dir + @"\PP-OCRv5_server_det_infer\";rec_model_dir = root_dir + @"\PP-OCRv5_server_rec_infer\";}int res = init(ref OCREngine, cpu_threads, enable_mkldnn, det_model_dir, limit_side_len, det_db_thresh, det_db_box_thresh, det_db_unclip_ratio, use_dilation, cls, use_angle_cls, cls_model_dir, cls_thresh, cls_batch_num, rec_model_dir, rec_char_dict_path, rec_batch_num, rec_img_h, rec_img_w, msgTemp);if (res == 0){MessageBox.Show("模型加载成功!");}else{string msg = msgTemp.ToString();MessageBox.Show("模型加载失败," + msg);}}private void checkBox1_CheckedChanged(object sender, EventArgs e){richTextBox1.Clear();if (checkBox1.Checked){richTextBox1.Text = OCRResultAllInfo.ToString();}else{richTextBox1.Text = OCRResultInfo.ToString();}}private void radioButton1_CheckedChanged(object sender, EventArgs e){RadioButton rb = sender as RadioButton;if (rb != null && rb.Checked){//MessageBox.Show("选中的是:" + rb.Text);LoadModel();}}}}

下载 

源码下载

http://www.xdnf.cn/news/8877.html

相关文章:

  • Python类属性与实例属性的覆盖机制:从Vector2d案例看灵活设计
  • linux学习第15天(dup和dup2)
  • 基于大模型预测亚急性脊髓联合变性的综合技术方案研究报告大纲
  • Gitlab 的 WIP 不生效了?
  • windows和mac安装虚拟机-详细教程
  • 基于Android的军训app的设计与实现
  • vue+js 创造动态的光晕圈
  • 【风控】什么是风控策略?
  • 基于ssm+mysql的实习支教中小学学校信息管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • ae卡通打架烟雾特效
  • [创业之路-381]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观-经济-如何获得国家经济政策与愿景规划,以及技术发展趋势、技术成熟度
  • 性能优化关键:link、script和meta的正确打开方式
  • day 36
  • SOC-ESP32S3部分:12-2、编码器驱动
  • 使用JSP踩过的坑
  • 《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条
  • 事务操作语句
  • ModbusRTU转profibusDP网关与电动机保护器通讯案例
  • 【操作系统】-4.3.1文件的层次结构
  • Linux驱动学习笔记(九)
  • Vue 3 (2) 模块化开发入门教程(ESM方式)
  • 32-低功耗与钩子函数
  • 人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化
  • 电路图识图基础知识-回路编号及代号(四)
  • 微信小程序常用方法
  • QListWidgetItem的函数介绍
  • Leetcode刷题 | Day67_图论12_Floyd算法 / A*算法
  • Kafka Consumer工作流程
  • 大数据治理:大数据环境下协同办公系统的数据串联与深度分析
  • python打卡训练营打卡记录day36