Paddle OCR V4 测试Demo

news2025/2/24 23:36:30

 效果

项目

VS2022+.net4.8+OCRV4

代码

using OpenCvSharp;
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PaddleInference.OCRServiceV4
{
    public partial class frmTest : Form
    {
        public frmTest()
        {
            InitializeComponent();
        }

        String startupPath;
        public PaddleOcrAll paddleOcr;
        private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        Bitmap bmp;
        PaddleOcrResult ocrResult;
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        String imgPath;
        Mat mat;
        Pen pen = new Pen(Brushes.Red, 2);

        private void frmTest_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
            startupPath = Application.StartupPath;
            rbOnnx.Checked = true;
        }

        private void btnLoadModel_Click(object sender, EventArgs e)
        {
            LoadModel();
            MessageBox.Show("加载完成");
        }

        void LoadModel()
        {
            string detectionModelDir;
            string classificationModelDir;
            string recognitionModelDir;
            string labelFilePath;

            if (comboBox1.SelectedIndex == 0)
            {
                detectionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_det_infer";
                classificationModelDir = startupPath + "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";
                recognitionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_rec_infer";
                labelFilePath = startupPath + "\\inference\\ppocr_keys.txt";
            }
            else
            {
                detectionModelDir = startupPath + "\\inference_server\\detv4_teacher_inference";
                classificationModelDir = startupPath + "\\inference_server\\ch_ppocr_mobile_v2.0_cls_infer";
                recognitionModelDir = startupPath + "\\inference_server\\ch_PP-OCRv4_rec_server_infer";
                labelFilePath = startupPath + "\\inference_server\\ppocr_keys.txt";
            }

            FullOcrModel model = FullOcrModel.FromDirectory(detectionModelDir, classificationModelDir, recognitionModelDir, labelFilePath, ModelVersion.V4);

            if (rbOnnx.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Onnx());
            }

            else if (rbOpenblas.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Openblas());
            }

            else if (rbMkldnn.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Mkldnn());
            }
            else
            {
                paddleOcr = new PaddleOcrAll(model);
            }

            paddleOcr.AllowRotateDetection = true;    /* 允许识别有角度的文字 */
            paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
        }


        private void btnSelect_Click(object sender, EventArgs e)
        {
            if (paddleOcr == null)
            {
                MessageBox.Show("请先加载模型");
                return;
            }


            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;

            imgPath = ofd.FileName;
            bmp = new Bitmap(imgPath, true);

            RotateImage(bmp);

            pictureBox1.Image = bmp;

            richTextBox1.Clear();

            mat = new Mat(ofd.FileName);
            //pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);


            dt1 = DateTime.Now;
            ocrResult = paddleOcr.Run(mat);
            dt2 = DateTime.Now;


            ShowOCRResult(ocrResult);

        }

        /// <summary>
        /// 显示结果
        /// </summary>
        private void ShowOCRResult(PaddleOcrResult ocrResult)
        {

            richTextBox1.Clear();
            Bitmap bitmap = (Bitmap)this.pictureBox1.Image;


            richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");
            richTextBox1.AppendText("-----------------------------------\n");
            richTextBox1.AppendText(ocrResult.Text + "\n");

            using (Graphics g = Graphics.FromImage(bitmap))
            {
                foreach (var item in ocrResult.Regions)
                {
                    g.DrawRectangle(pen, item.Rect.BoundingRect().Left, item.Rect.BoundingRect().Top, item.Rect.BoundingRect().Width, item.Rect.BoundingRect().Height);
                }
            }

            pictureBox1.Image = null;
            pictureBox1.Image = bitmap;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (paddleOcr == null)
            {
                MessageBox.Show("请先加载模型");
                return;
            }

            if (pictureBox1.Image == null)
            {
                return;
            }
            richTextBox1.Clear();
            Application.DoEvents();

            dt1 = DateTime.Now;
            ocrResult = paddleOcr.Run(mat);
            dt2 = DateTime.Now;

            ShowOCRResult(ocrResult);
        }

        /// <summary>
        /// 根据图片exif调整方向
        /// </summary>
        /// <param name="img"></param>
        public void RotateImage(Bitmap img)
        {
            var exif = img.PropertyItems;
            byte orien = 0;
            var item = exif.Where(m => m.Id == 274).ToArray();
            if (item.Length > 0)
                orien = item[0].Value[0];
            switch (orien)
            {
                case 2:
                    img.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
                    break;
                case 3:
                    img.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
                    break;
                case 4:
                    img.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
                    break;
                case 5:
                    img.RotateFlip(RotateFlipType.Rotate90FlipX);
                    break;
                case 6:
                    img.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
                    break;
                case 7:
                    img.RotateFlip(RotateFlipType.Rotate270FlipX);
                    break;
                case 8:
                    img.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
                    break;
                default:
                    break;
            }
        }

    }
}

Demo下载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java连接sqlserver细节处理

这个文章记录一下java连接sqlserver细节处理 &#xff0c;有其他的细节可以评论。 首先是 驱动 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverpom文件 将mysql的改成这个 <!-- 数据库驱动 --><dependency><groupId>com.microsoft.sqlserve…

iOS字体像素与磅的对应关系

注意&#xff1a;低于iOS10的系统&#xff0c;显示的字宽和字高比高于iOS10的系统小。 这就是iOS10系统发布时&#xff0c;很多app显示的内容后面出现…&#xff0c;因而出现很多app为了适配iOS10系统而重新发布新版本。 用PS设计的iOS效果图中&#xff0c;字体是以像素&#x…

2023年大数据与计算国际会议 (WBDC 2023)| EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09; 会议时间&#xff1a;2023年11月17 -19日 召开地点&#xff1a;中国西安 大会官网&#xff1a;www.iwbdc.org 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09;将围绕“…

PostgreSQL中根据时间段范围查询数据,如19:29:10到20:29:10范围内的数据,排除年月日

数据格式如下 问题描述 我的SQL语句条件是 WHERE (TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) > 19:29:10 AND TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) < 20:29:10)为什么我数据的时间是2023-07-20 17:58:29也能被查出来&#xff1f; 问题解决…

Centos7.9系统_亲测成功_磁盘满了_分区和挂载新盘_创建文件夹并挂载分区---Linux工作笔记057

由于在某些部署环境下,运维管理员,仅仅是给分配一些硬盘容量,但是并没有进行分区和挂载到对应的合适的目录下,因此这个时候就需要我们自己去处理了. 这个是自己亲测成功的:由于是后面记录的,尽量记录详细 free -h 查看一下内存情况 df -h查看 硬盘的使用情况,还有是否有没挂载…

Drools用户手册翻译——第四章 Drools规则引擎(十五)复杂事件处理(CEP)查询、事件监听、调试日志和性能调优

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 Drools查询和实时…

瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明

如今API作为连接服务和传输数据的重要通道&#xff0c;已成为数字时代的新型基础设施&#xff0c;但随之而来的安全问题也日益凸显。为了让各个行业更好地应对API安全威胁挑战&#xff0c;瑞数信息作为国内首批具备“云原生API安全能力”认证的专业厂商&#xff0c;近年来持续输…

pve7.2虚拟机 lvm磁盘扩容,增加硬盘操作

之前安装pve时候只有256的ssd,最近安装的虚拟机较多&#xff0c;给加块闲置硬盘&#xff0c;顺便学习一下&#xff0c;像pve这种虚拟机系统&#xff0c;硬盘应该可以像nas你这样随时增加&#xff0c;而不影响上层应用&#xff0c;我自己也是摸索着做。 一、安装好硬盘后打开pv…

对于企业:数字化的趋势不可阻挡.以无代码开发实现敏捷交付

在科技日新月异的今天&#xff0c;我们正处在一个由数据驱动的时代。为了在这个时代中占据一席之地&#xff0c;我们需要不断探索新的开发模式&#xff0c;以适应不断变化的市场需求。其中&#xff0c;无代码开发模式正逐渐成为引领未来科技的关键。 一、什么是无代码开发 无代…

2023年市面上最受欢迎的工程项目管理软件推荐

随着科技的发展和工程项目的复杂性增加&#xff0c;工程项目管理软件成为了现代项目管理中不可或缺的工具。这些软件可以帮助团队更好地协调、组织和执行工程项目&#xff0c;并提高项目的效率和成功率。本文结合了不同的产品测评网站&#xff0c;总结了以下四款备受好评的工程…

LabVIEW控制通用工作台

LabVIEW控制通用工作台 用于教育目的的计算机化实验室显着增长&#xff0c;特别是用于运动控制的实验室。它们代表了各种工业应用中不断扩大的领域&#xff0c;并成为以安全的方式使用通常昂贵或独特的实验室设备进行实时实验的宝贵工具。NI LabVIEW等软件应用程序的开发和不断…

甘特图:项目管理软件的应用,让项目团队提高工作效率

项目管理软件可以帮助项目团队更有效地分配资源、监控进度、降低风险&#xff0c;提高工作效率。 通过利用项目管理软件的强大功能&#xff0c;团队可以更好地应对项目中的各种挑战&#xff0c;确保项目按计划推进并实现项目目标。 任务分解&#xff1a;通过项目管理软件进…

uni-app项目运行在安卓真机调试

uni-app项目运行在安卓真机调试 手机开启开发者模式 在系统设置——关于手机——连续点击系统版本号5-7次&#xff0c;直到提示“您已处于开发者模式”。具体如下图&#xff1a; 手机开启USB调试 在系统和更新——开发人员选项——打开USB调试。具体如下图所示&#xff1a…

【HCIP】重发布实验2

题目 拓扑图 配置&#xff1a; R1 //ip配置 [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 14.1.1.1 24 //配置RIP和OSPF并且实现…

学习笔记|printf函数的实现|不同操作系统中的换行|数的进制:2进制、10进制、16进制转换|STC32G单片机视频开发教程(冲哥)|第五集:C语言基础

文章目录 1.C语言 printf函数的实现Tips&#xff1a;ASCII码表Tips&#xff1a;找不到头文件怎么办&#xff1f;主函数添加程序:常规用法:Tips&#xff1a;不同操作系统中的换行 ⒉数的进制:2进制、10进制、16进制.常见的对应&#xff1a; 1.C语言 printf函数的实现 printf 是…

创新零售,京东重新答题?

继新一轮组织架构调整后&#xff0c;京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日&#xff0c;京喜拼拼已改名为京东拼拼&#xff0c;与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时&#xff0c;拼拼的更…

自定义element-plus的弹框样式

项目中弹框使用频繁,需要统一样式风格,此组件可以自定义弹框的头部样式和内容 一、文件结构如下: 二、自定义myDialog组件 需求&#xff1a; 1.自定义弹框头部背景样式和文字 2.自定义弹框内容 3.基本业务流程框架 components/myDialog/index.vue完整代码&#xff1a; &…

Kubernetes(K8s)入门

一、Kubernetes是什么 Kubernetes是什么? 首先&#xff0c;它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新&#xff0c;但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说&#xff0c;Kubernetes是谷歌严格保密十几年的…

hutool 导出复杂表头excel

假如已这样的表头导出数据 1.把包含表头的excel添加到项目资源目录 2.编写代码读取表头所在sheet,并且加入需导出的数据 /*** 导出excel*/public static void downloadExcel(List<List<Object>> list, HttpServletResponse response) throws IOException {/*Strin…

应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案

Part.1 项目背景 在现代物流和制造行业中&#xff0c;纸箱的拆码垛操作是一项重要且频繁的任务。传统的纸箱拆码垛工作通常由人工完成&#xff0c;这种方式存在劳动强度大、生产效率低以及人为操作容易导致错误等问题&#xff0c;严重影响物料的安全运输和质量。为了满足物流行…