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

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍

铁路货运企业需要对物流单进行长期存档,以便后续查询和审计。不同的物流单可能包含不同的关键信息,通过自定义指定多个区域进行识别重命名,可以使存档的图片文件名具有统一的规范和明确的含义。比如,将包含货物运单车种车号、批次号等重要信息的区域进行识别,并将这些信息融入文件名中。这样,在需要查找某一份特定的物流单时,只需通过文件名即可快速定位,大大提高了存档管理的效率和准确性。

以下是一个基于 WPF 和飞桨 OCR 深度学习模型实现批量图片自定义指定多个区域识别重命名的解决方案,包含详细步骤和完整代码。

详细步骤

1. 环境准备
  • 安装 Visual Studio:用于开发 WPF 应用程序。
  • 安装 Python 和飞桨 OCR:飞桨 OCR 是基于 Python 的,需要安装 Python 环境(建议 Python 3.7 及以上),并安装飞桨 OCR 库。可以使用以下命令安装:

bash

pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install paddleocr -i https://mirror.baidu.com/pypi/simple
2. 创建 WPF 项目
  • 打开 Visual Studio,创建一个新的 WPF 应用程序项目。
3. 设计 WPF 界面
  • MainWindow.xaml文件中设计界面,包含选择图片文件夹按钮、选择保存文件夹按钮、指定识别区域的输入框、开始处理按钮等。
4. 实现图片处理逻辑
  • 使用ProcessStartInfo调用 Python 脚本,将图片路径和识别区域信息传递给 Python 脚本。
  • Python 脚本使用飞桨 OCR 对指定区域进行识别,并返回识别结果。
  • 根据识别结果对图片进行重命名。

完整代码

MainWindow.xaml

xml

<Window x:Class="ImageOCRRenamer.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="批量图片自定义指定多个区域识别重命名" Height="450" Width="800"><Grid><Button Content="选择图片文件夹" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" Width="150" Click="SelectImageFolder_Click"/><TextBox x:Name="ImageFolderTextBox" HorizontalAlignment="Left" Height="23" Margin="180,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="580" IsReadOnly="True"/><Button Content="选择保存文件夹" HorizontalAlignment="Left" Margin="20,60,0,0" VerticalAlignment="Top" Width="150" Click="SelectSaveFolder_Click"/><TextBox x:Name="SaveFolderTextBox" HorizontalAlignment="Left" Height="23" Margin="180,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="580" IsReadOnly="True"/><Label Content="指定识别区域(格式:x1,y1,x2,y2;x3,y3,x4,y4;...)" HorizontalAlignment="Left" Margin="20,100,0,0" VerticalAlignment="Top"/><TextBox x:Name="RegionTextBox" HorizontalAlignment="Left" Height="23" Margin="20,130,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="740"/><Button Content="开始处理" HorizontalAlignment="Left" Margin="350,200,0,0" VerticalAlignment="Top" Width="100" Click="StartProcessing_Click"/></Grid>
</Window>
MainWindow.xaml.cs

csharp

using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using Microsoft.Win32;namespace ImageOCRRenamer
{public partial class MainWindow : Window{private string imageFolder;private string saveFolder;public MainWindow(){InitializeComponent();}private void SelectImageFolder_Click(object sender, RoutedEventArgs e){var dialog = new OpenFileDialog();dialog.Multiselect = false;dialog.CheckFileExists = false;dialog.CheckPathExists = true;dialog.FileName = "Select Folder";dialog.Filter = "All files (*.*)|*.*";if (dialog.ShowDialog() == true){imageFolder = Path.GetDirectoryName(dialog.FileName);ImageFolderTextBox.Text = imageFolder;}}private void SelectSaveFolder_Click(object sender, RoutedEventArgs e){var dialog = new OpenFileDialog();dialog.Multiselect = false;dialog.CheckFileExists = false;dialog.CheckPathExists = true;dialog.FileName = "Select Folder";dialog.Filter = "All files (*.*)|*.*";if (dialog.ShowDialog() == true){saveFolder = Path.GetDirectoryName(dialog.FileName);SaveFolderTextBox.Text = saveFolder;}}private void StartProcessing_Click(object sender, RoutedEventArgs e){if (string.IsNullOrEmpty(imageFolder) || string.IsNullOrEmpty(saveFolder) || string.IsNullOrEmpty(RegionTextBox.Text)){MessageBox.Show("请选择图片文件夹、保存文件夹并指定识别区域。");return;}string regions = RegionTextBox.Text;foreach (string file in Directory.GetFiles(imageFolder, "*.jpg;*.png;*.jpeg", SearchOption.AllDirectories)){string result = RunPythonScript(file, regions);if (!string.IsNullOrEmpty(result)){string newFileName = $"{result}{Path.GetExtension(file)}";string newFilePath = Path.Combine(saveFolder, newFileName);File.Copy(file, newFilePath, true);}}MessageBox.Show("处理完成。");}private string RunPythonScript(string imagePath, string regions){string pythonScriptPath = @"path_to_your_python_script.py"; // 替换为实际的Python脚本路径string pythonPath = @"C:\Python39\python.exe"; // 替换为实际的Python解释器路径ProcessStartInfo start = new ProcessStartInfo();start.FileName = pythonPath;start.Arguments = $"\"{pythonScriptPath}\" \"{imagePath}\" \"{regions}\"";start.UseShellExecute = false;start.CreateNoWindow = true;start.RedirectStandardOutput = true;start.RedirectStandardError = true;using (Process process = Process.Start(start)){using (StreamReader reader = process.StandardOutput){string result = reader.ReadToEnd();string error = process.StandardError.ReadToEnd();if (!string.IsNullOrEmpty(error)){MessageBox.Show($"Python脚本执行出错:{error}");}return result.Trim();}}}}
}
Python 脚本(path_to_your_python_script.py)

python

import sys
from paddleocr import PaddleOCRdef main():image_path = sys.argv[1]regions = sys.argv[2].split(';')ocr = PaddleOCR(use_angle_cls=True, lang="ch")result_text = ""for region in regions:x1, y1, x2, y2 = map(int, region.split(','))cropped_image = Image.open(image_path).crop((x1, y1, x2, y2))result = ocr.ocr(cropped_image, cls=True)for line in result[0]:result_text += line[1][0]print(result_text)if __name__ == "__main__":main()

代码解释

  • WPF 界面:提供选择图片文件夹、保存文件夹、指定识别区域和开始处理的功能。
  • C# 代码:处理用户界面交互,调用 Python 脚本进行 OCR 识别,并根据识别结果对图片进行重命名和保存。
  • Python 脚本:使用飞桨 OCR 对指定区域进行识别,并返回识别结果。

注意事项

  • 请将pythonScriptPathpythonPath替换为实际的 Python 脚本路径和 Python 解释器路径。
  • 确保 Python 环境和飞桨 OCR 库已正确安装。
  • 识别区域的格式为x1,y1,x2,y2;x3,y3,x4,y4;...,其中(x1, y1)(x2, y2)分别为矩形区域的左上角和右下角坐标。

相关文章:

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…...

Spring Boot篇

为什么要用Spring Boot Spring Boot 优点非常多&#xff0c;如&#xff1a; 独立运行 Spring Boot 而且内嵌了各种 servlet 容器&#xff0c;Tomcat、Jetty 等&#xff0c;现在不再需要打成 war 包部署到 容器 中&#xff0c;Spring Boot 只要打成一个可执行的 jar 包就能独…...

Unity3D学习笔记(二)

一、Unity编辑器相关 1、 Unity特殊的专属文件夹 1&#xff09; Editor&#xff1a;编辑器相关资源可以放到此文件中&#xff0c;包括图片、脚本等文件。 2&#xff09;Editor Default Resources:配合Editor使用不会打包到包中 3&#xff09;Plugins&#xff1a;存放第三方SD…...

个人毕业设计--基于HarmonyOS的旅行助手APP的设计与实现(挖坑)

在行业混了短短几年&#xff0c;却总感觉越混越迷茫&#xff0c;趁着还有心情学习&#xff0c;把当初API9 的毕业设计项目改成API13的项目。先占个坑&#xff0c;把当初毕业设计的文案搬过来 摘要&#xff1a;HarmonyOS&#xff08;鸿蒙系统&#xff09;是华为公司推出的面向全…...

游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...

python开发:爬虫示例——GET和POST请求处理

一、Get请求 import json import requests#输入示例&#xff1a;urlhttps://www.baidu.com #RequestHeader:F12标头-请求标头-原始-复制到这&#xff08;忽略第一句&#xff09; def GetRequest(url,RequestHeader""):try:dic{}RequestHeaderList RequestHeader.s…...

开源数据分析工具 RapidMiner

RapidMiner是一款功能强大且广泛应用的数据分析工具&#xff0c;其核心功能和特点使其成为数据科学家、商业分析师和预测建模人员的首选工具。以下是对RapidMiner的深度介绍&#xff1a; 1. 概述 RapidMiner是一款开源且全面的端到端数据科学平台&#xff0c;支持从数据准备、…...

Vue canvas画图画线例子,数据回显与隔离,点拖拽修改

组件 <template><divstyle"display: flex; height: 342px; width: 760px; border: 1px solid #000"><divstyle"position: relative; height: 100%; width: 608px; min-width: 608px"><canvasid"mycanvas"ref"mycanva…...

Python实现CAN FD 通信(基于PCAN开发CAN FD测试工具)

目录 一.背景 二. 硬件环境 1.CAN通信设备之PCAN 2.物理架构图 三. 资料分析 四. 二次开发 五. 应用 六. 总结 一.背景 在汽车电子领域中CAN是一种被广泛应用的通信协议,CAN 是controller area network 的缩写(以下称为can),是iso国际标准化的串行通信协议。 关于…...

LeetCode--347. 前 K 个高频元素/Golang中的堆(container/heap)

例题链接-前k个高频元素 前言 以前都是用的C写算法题&#xff0c;最近也想熟悉一下golang的数据结构&#xff0c;故来一篇题解堆分析。 正文 这里重点不在分析题目&#xff0c;在于golang中的 container/heap 对于内部实现逻辑有兴趣的可以去看看源码。 这里先给出题解的代…...

关于大数据

在大数据背景下存在的问题&#xff1a; 非结构化、半结构化数据&#xff1a;NoSQL数据库只负责存储&#xff1b;程序处理时涉及到数据移动&#xff0c;速度慢 是否存在一套整体解决方案&#xff1f; 可以存储并处理海量结构化、半结构化、非结构化数据 处理海量数据的速…...

9-收纳的知识

[ComponentOf(typeof(xxx))]组件描述&#xff0c;表示是哪个实体的组件 [EntitySystemOf(typeof(xxx))] 系统描述 [Event(SceneType.Demo)] 定义事件&#xff0c;在指定场景的指定事件发生后触发 [ChildOf(typeof(ComputersComponent))] 标明是谁的子实体 [ResponseType(na…...

堆的实现——堆的应用(堆排序)

文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候&#xff0c;需要有二叉树的基础知识&#xff0c;大家可以看我的二叉树文章&#xff1a;二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …&#xff0c;kn−1 } &#xff0c;把它的所有元素按完全⼆叉树…...

机器学习6-全连接神经网络2

机器学习6-全连接神经网络2-梯度算法改进 梯度下降算法存在的问题动量法与自适应梯度动量法一、动量法的核心思想二、动量法的数学表示三、动量法的作用四、动量法的应用五、示例 自适应梯度与RMSProp 权值初始化随机权值初始化Xavier初始化HE初始化(MSRA) ![在这里插入图片描述…...

基于 SpringBoot 的电影购票系统

基于SpringBoot的电影购票系统是一个集成了现代化Web开发技术的在线电影票务平台。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 随着电影行业的快速发展和观众对观影体验的不断追求&#xff0c;电影票务管理面临着越来越多的挑战。传统的票务管理方式存在效率低…...

C++SLT(三)——list

目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...

C++ Primer 算术运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…...

【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证8 导入官方契约测试集合9 契约测试集合的详细配置9.1 env-apiKey 的创建与设置9.2 env-workspaceId 的设置9.3 Mock 服务器及 env-server 的配置9.4 API 测试实例的配置…...

R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框

目的&#xff1a;画热图&#xff0c;分区&#xff0c;给对角线分区添加黑色边框 建议直接看0和4。 0. 准备数据 # 安装并加载必要的包 #install.packages("ComplexHeatmap") # 如果尚未安装 library(ComplexHeatmap)# 使用 iris 数据集 #data(iris)# 选择数值列&a…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...