C# PaddleInference OCR 表格识别

news2024/10/7 18:30:35

效果

项目

VS2022+.net4.8+OpenCvSharp4+Sdcb.PaddleInference+Sdcb.PaddleOCR

 测试图片

 代码

using OpenCvSharp.Extensions;
using OpenCvSharp;
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Details;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;


namespace PaddleInference_OCR_表格识别
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        Bitmap bmp;
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string img = "";
        string startupPath = "";


        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;

            pictureBox1.Image = null;

            img = ofd.FileName;
            bmp = new Bitmap(img);
            pictureBox1.Image = new Bitmap(img);
        }

        TableRecognitionModel tableModel;
        PaddleOcrTableRecognizer tableRec;

        FullOcrModel model;
        PaddleOcrAll paddleOcr;

        private void Form1_Load(object sender, EventArgs e)
        {
            startupPath = System.Windows.Forms.Application.StartupPath;
            string table_directoryPath = startupPath + "\\ch_ppstructure_mobile_v2.0_SLANet";
            string table_labelFilePath = startupPath + "\\table_structure_dict_ch.txt";

            tableModel = new FileTableRecognizationModel(table_directoryPath, table_labelFilePath);
            tableRec = new PaddleOcrTableRecognizer(tableModel);

            string detectionModelDir = startupPath + "\\ch_PP-OCRv3_det";
            string classificationModelDir = startupPath + "\\ch_ppocr_mobile_v2.0_cls";
            string recognitionModelDir = startupPath + "\\ch_PP-OCRv3_rec";
            string labelFilePath = startupPath + "\\ppocr_keys_v1.txt";

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

            paddleOcr = new PaddleOcrAll(model, PaddleDevice.Mkldnn());
            paddleOcr.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
        }

        TableDetectionResult tableResult;
        private void button2_Click(object sender, EventArgs e)
        {

            if (pictureBox1.Image == null)
            {
                return;
            }

            Mat src = Cv2.ImRead(img);
            tableResult = tableRec.Run(src);

            List<TableCellBox> ltCellBox = tableResult.StructureBoxes;

            foreach (TableCellBox item in ltCellBox)
            {
                Scalar scalar = Scalar.RandomColor();
                Cv2.Rectangle(src, item.Rect, scalar);
            }
            //Cv2.ImShow("src", src);
            //Cv2.ImWrite("src.jpg", src);
            pictureBox1.Image = BitmapConverter.ToBitmap(src);

            //List<string> ltTags = tableResult.HtmlTags;
            //float score = tableResult.Score;

            paddleOcr.Detector.UnclipRatio = 1.2f;
            PaddleOcrResult result = paddleOcr.Run(src);

            src.Dispose();

            string html = tableResult.RebuildTable(result);
            textBox1.Text = html;
            System.IO.File.WriteAllText("table.html", html);

            webBrowser1.DocumentText = html;
        }
    }
}

Demo下载 

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

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

相关文章

netwox伪造ARP响应【网络工程】(保姆级图文)

目录 伪造ARP响应1) 在模拟之前&#xff0c;验证局域网中是否存在主机 192.168.43.97。在主机 B 上使用 arping 命令 ping 该主机。执行命令如下&#xff1a;2) 在主机 A 上伪造 ARP 响应&#xff0c;创建虚拟主机 192.168.43.97&#xff0c;设置其 MAC 地址为 A1&#xff1a;B…

react 初学(1)

1.安装环境 需要Node.js 自行下载安装 然后全局安装create-react-app npm install -g create-react-app 如果出现报错请参考 create-react-app -V 报错无法将“create-react-app”项识别为 cmdlet、函数、脚本文件或可运行程序的名称_Java-请多指教的博客-CSDN博客 2.创建…

尚医通04:Axios Node Npm bable webpack+前端工程改造

目录 本日学习 内容介绍 Axios Node NPM包管理器 本日学习 1. 了解Axios :他是异步请求用的&#xff0c;前后端。 用于在浏览器和 Node.js 中发送 HTTP 请求。它支持从服务器获取数据、上传数据以及执行其他与 HTTP 相关的操作。 2.Node:它允许你在服务器端运行 JavaScrip…

stm32(adc数模转换)

ADC介绍 ADC是什么&#xff1f; 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xff0c;比如&#xff1…

Leetcode每日一题:931. 下降路径最小和(2023.7.13 C++)

目录 931. 下降路径最小和 题目描述&#xff1a; 实现代码与解析&#xff1a; 动态规划 原理思路&#xff1a; 931. 下降路径最小和 题目描述&#xff1a; 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降…

mongdb实战

概述 前言 这几天轮播图想用mongdb开发&#xff0c;然后就有了一下代码 效果图 源码如下 package jkw.pojo;import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; import org.springframewo…

【JAVA】穷词——基于嵌入式的数据库derby+BeautyEye的单词字典应用

文章目录 1. 题目2. 项目结构层次3. 环境以及技术栈说明4. 项目报告4.1软件功能描述4.2项目类图4.2.1 src层级下的类图4.2.2 data层级下的类图4.2.3 gui层级下的类图4.2.4 resource层级下的类图4.2.5 view层级下的类图4.2.6 DelWord的类图4.2.7 CustomMessageDialog的类图4.2.8…

Antd List组件增加gutter属性后出现横向滚动,如何解决

第一次使用ant design的List列表组件&#xff0c;设置gutter间隔属性后&#xff0c;页面出现了横向滚动条&#xff0c;查阅文档发现是由于加间隔后导致容器宽度被撑开&#xff0c;ant design官方默认给外层容器加了margin-left和margin-right 解决方法是在外层容器预留一定的pa…

stringstream的使用

写到290题使用stringstream简化步骤&#xff0c;学习一下使用 目录 小问题&#xff1f; 成员函数clear() 那么问题来了&#xff1f;clear在啥时候用呢&#xff1f; 数据类型转换 <sstream>库定义了三种类&#xff1a;istringstream、ostringstream、stringstream &l…

RT1176 LCDIFv2 RGB565引脚不连续

RT1052和RT1176的LCDIF&#xff0c;使用RGB565格式时PIN脚分配是连续的:LCDIF_DATA00~LCDIF_DATA15。 但RT1176的LCDIFv2并不是这样&#xff0c;使用RGB565格式时PIN脚分配不是连续的&#xff0c;而是移位填充8位*324位分配的。 RT1176 LCDIFv2 RGB565LCDIF_DATA00LCDIF_DATA0…

CVE漏洞复现-CVE-2021-36934 Windows 提权漏洞

CVE-2021-36934 Windows 提权漏洞 漏洞描述 7月20日&#xff0c;微软确认了一个新的本地提权漏洞&#xff0c;安全研究成员将其称为HiveNightmare或者SeriousSAM&#xff0c;该漏洞允许低权限的用户访问Windows系统文件。成功利用此漏洞的攻击者可以使用SYSTEM特权运行任意代…

16位ADC芯片SGM58031驱动重点

16位ADC芯片SGM58031驱动重点 文章目录 16位ADC芯片SGM58031驱动重点引脚描述时间要求I2C时序图I2C通讯描述I2C接口I2C地址选择I2C常规呼叫I2C速度模式从模式操作 寄存器指针寄存器转换寄存器配置寄存器低阈值和高阈值寄存器Config1寄存器芯片ID寄存器GN_Trim1寄存器&#xff0…

Linux(驱动编程)(调试技术)(imx6ull)

调试技术 1、在写驱动程序时函数未包含头文件 在linux内核源码driver/char目录下输入命令 grep “XXXX” * -nrw查看次函数在那个.c里用过&#xff0c;然后在vscode界面下按altp搜索这个.c就可以参考这个.c的头文件。 2、编译完驱动跟应用后先 insmod xxx.ko //插入 cat /…

原创 | SQL和 NoSQL的基本操作和查询语句

作者&#xff1a;杨金珊本文约3500字&#xff0c;建议阅读7分钟本文为你介绍SQL和 NoSQL的基本操作和查询语句。 SQL&#xff08;结构化查询语言&#xff09; SQL是用于管理和操作关系型数据库的语言。它遵循结构化模式&#xff0c;将数据组织成具有预定义关系的表格形式。以下…

告别被坑!掌握合合信息AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1&#xff1a;AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2&#xff1a;生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

03_007linux内存管理架构以虚拟内存空间布局架构

内存管理子系统架构 内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面&#xff0c;具体结构如 下图所示: 1、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。 2、内核空间:内核总是驻留在内存中&#xff0c;是操作系统的一部分。内核空间为内…

nginx uwsgi配置django

uwsgi文件 [uwsgi] # 服务端口号&#xff0c;这里没有设置IP值&#xff0c;默认是加载服务器的IP地址 #http :5000 socket:8000 # flask项目地址 chdir /pyprogram/electric # wsgi文件 /home/flask_project/mange.py #module app:app wsgi-file/pyprogram/electric/electr…

CompletionService的基本使用以及原理

文章目录 一、CompletionService的简介二、CompletionService的底层大致原理三、CompletionService的使用场景1. 批量下载文件&#xff1a;2. 多个商品价格查询&#xff1a;3. 并发处理多个API请求&#xff1a; 四、CompletionService的使用demo1. 代码如下&#xff1a;2. 案例…

mac上 如何批量在文件名中插入文字

mac上 如何批量在文件名中插入文字&#xff1f;在使用Mac电脑的时候&#xff0c;我们经常需要对大量文件的名称进行修改&#xff0c;例如需要在大量文件的名称中插入一些相同的文字或者字符的时候&#xff0c;你会用什么方法来完成这项工作呢&#xff1f;相信很多人就面对过类似…

前端vue入门(纯代码)30_路由的props配置

喜欢的东西太贵了&#xff0c;我一咬牙&#xff0c;狠下心决定不喜欢了&#xff01; 【28.Vue Router--路由的props配置】 props配置官网文档 props属性用法和params属性差不多&#xff0c;都是要在src/router/index.js文件中配置 // 该文件专门用于创建整个应用的路由器 i…