C# PaddleInference OCR 表格识别

效果

项目

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.hqwc.cn/news/18717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发中的单例模式

在前端开发中&#xff0c;单例模式是一种常见的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 在JavaScript中&#xff0c;可以使用以下几种方式来实现单例模式&#xff1a; 字面量方式&#xff1a; const singleton {// …

spring boot 集成dubbo

本demo使用spring boot 2.4.1版本集成 dubbo 2.7.15 1.创建maven项目及其子模块 父工程pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.ap…

如何在海外进行A/B测试

A/B测试是对应用的各个版本进行实验&#xff0c;以分析用户如何与其交互的有效过程&#xff0c;它能够帮助我们改进关键指标&#xff0c;例如参与度或应用内购买&#xff0c;以及推出新功能&#xff0c;从而最大限度地降低大规模流失用户的风险。 A/B测试和ASO优化通常适用于应…

Android Jetpack Compose多平台用于Android和IOS

Android Jetpack Compose多平台用于Android和IOS JetBrains和外部开源贡献者已经努力工作了几年时间来开发Compose Multiplatform&#xff0c;并最近发布了适用于iOS的Alpha版本。自然地&#xff0c;我们对其功能进行了测试&#xff0c;并决定通过使用该框架在iOS上运行我们的…

分布式搜索--elasticsearch

一、初识 elasticsearch 1. 了解 ES ① elasticsearch 是一款非常强大的开源 搜索引擎&#xff0c;可以帮助我们从海量数据中 快速找到需要的内容 ② elasticsearch 结合 kibana、Logstash、 Beats&#xff0c;也就是 elastic stack (ELK)&#xff0c;被 广泛应用在日志数据分…

架构师日记-到底该如何搭建一个新系统 | 京东云技术团队

一 前言 架构设计按照实施过程可分为工程架构&#xff0c;业务架构&#xff0c;部署架构等多个维度&#xff0c;一个好的系统架构标准应该具备可扩展、可维护、可靠性、安全性和高性能等特点。尽管这些特点大家都熟知&#xff0c;但在实际落地时&#xff0c;我们更为迫切的想知…

pytorch线性模型 学习前要学习的基础知识

跟着刘二大人学pytorch&#xff0c;补全一下我的基础缺失 1.numpy基础 import numpy as np from PIL import Image anp.array([1,2,3]) #生成一维数组 print(a) bnp.arange(1,4)#创建等差数组&#xff0c;默认等差是1&#xff0c;数组为1&#xff0c;2&#xff0c;3&#xff0…

Efficient Methods for Non-stationary Online Learning

Dynamic regret Adaptive regret 假设&#xff1a; 算法过程&#xff1a; Regret分析

D. Pairs of Segments

Problem - D - Codeforces 思路&#xff1a;其实它求的就是不相交区间的最大数量&#xff0c;但是它的区间是两个区间合并得到&#xff0c;所以我们可以直接将所有能合并的区间直接合并&#xff0c;然后做一遍不相交区间的最大数量&#xff0c;这样存在一种问题就是一个区间会不…

SolidWorks二次开发-BOM球标和材料表

目标先到100&#xff0c;实在没什么好写的了&#xff0c;先把这两个简单的功能列一下吧。 private void btnInsertBalloon_Click(object sender, EventArgs e){//插入对应的BOM气泡球 球标//操作步骤->选中视图&#xff0c;执行自动球标命令SldWorks swApp Utility.Conne…

Flowable边界事件-定时边界事件

定时边界事件 定时边界事件一、定义1. 图形标记2. 完整的流程图3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 定时边界事件测试用例 总结 定时边界事件 一、定义 时间达到设定的时间之后触发事件 由于定时边界事件和开始定时事件几乎差不多&#xff0c;四种情况我就不一…

linux入门练级篇 第三讲 基本指令3

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…