C#实战:使用腾讯云识别服务轻松提取火车票信息
目录
一、腾讯票据单据识别 Invoice OCR服务介绍
二、开发完整流程
2.1 开通文字识别服务
2.2 创建开发者密钥
2.3 创建项目编写代码集成
三、总结
公司内部涉及到车票报销的时候一个个输入火车票信息非常麻烦,尤其是出差比较多的企业,这对于财务人员的涉及报销单据录入还是非常麻烦的。今天给大家分享使用腾讯云车票识别服务,轻松提取火车票信息。这样可以方便把识别服务集成到业务系统,可以大大减轻财务人员录入单据信息的工作量。今天采用C#编程语言给大家提供一个可用的Demo,感兴趣的朋友可以了解一下!
一、腾讯票据单据识别 Invoice OCR服务介绍
官网
该服务基于腾讯优图实验室的深度学习技术,可以将图片上的文字内容,智能准确识别成为可编辑的文本。这里主要说一下火车票识别。
该服务支持火车票图片全字段的识别,包括编号、出发站、到达站、出发时间、车次、座位号、姓名、票价、席别、身份证号、发票消费类型、序列号、加收票价、手续费、大写金额、售票站、原票价、发票类型、收据号码、是否仅供报销使用等字段的识别。它具有识别速度快、准确率高等特点。
二、开发完整流程
● 开通服务
● 申请创建开发者密钥
● 创建项目编写代码集成
2.1 开通文字识别服务
首先需要使用自己的账户登录腾讯云官网,然后进入文字识别服务控制台,开通服务。开通服务后可以查看资源包,默认有1000次的免费额度,方便大家本地开发测试,确认没问题后再去购买资源包,部署到生产环境使用。这个对于开发者还是非常有好的。
另外给大家分享腾讯云双十一拼团活动,优惠多多,不容错过!专属链接
这里给推荐拼团购买轻量级服务器配置为2核2G3M带宽一年仅需68元,并且加赠3个月,相当于68元购买了15个月轻量级服务器简直太划算了,需要购买服务器的朋友不容错过!
2.2 创建开发者密钥
如果需要本地集成开发的话,需要申请开发者密钥,然后创建开发者密钥。创建成功之后如下:
注意:一定要妥善保护后自己的开发密钥
2.3 创建项目编写代码集成
首先打开VS2022创建一个WinForm项目,项目名称为TrainTicketRecognitionDemo
,具体创建如下:
然后点击创建按钮来初始化项目。项目初始化如下:
安装腾讯云文字识别的依赖包依赖包搜索TencentCloudSDK.Ocr
安装成功后如下
接着创建一个火车票识别工具类TrainTicketRecognitionUtils.cs
using Newtonsoft.Json;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Ocr.V20181119;
using TencentCloud.Ocr.V20181119.Models;namespace TrainTicketRecognitionDemo
{/// <summary>/// 火车票查询工具类/// </summary>public class TrainTicketRecognitionUtils{public static TrainTicketRecognitionModel GetTicketStr(string imageUrl){// 注意密钥妥善保存,避免泄露,可以放入配置文件或者数据库中Credential cred = new Credential{SecretId = "个人SecretId",SecretKey = "个人SecretKey"};// 实例化一个client选项,可选的,没有特殊需求可以跳过ClientProfile clientProfile = new ClientProfile();// 实例化一个http选项,可选的,没有特殊需求可以跳过HttpProfile httpProfile = new HttpProfile();httpProfile.Endpoint = ("ocr.tencentcloudapi.com");clientProfile.HttpProfile = httpProfile;// 实例化要请求产品的client对象,clientProfile是可选的OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);// 实例化一个请求对象,每个接口都会对应一个request对象TrainTicketOCRRequest req = new TrainTicketOCRRequest();req.ImageUrl = imageUrl;// 返回的resp是一个TrainTicketOCRResponse的实例,与请求对象对应TrainTicketOCRResponse resp = client.TrainTicketOCRSync(req); TrainTicketRecognitionModel trainTicketRecognitionModel = JsonConvert.DeserializeObject<TrainTicketRecognitionModel>(AbstractModel.ToJsonString(resp));return trainTicketRecognitionModel;}}
}
创建TrainTicketRecognitionModel.cs 实体类
用来接收调用接口成功后返回过来的结果
public class TrainTicketRecognitionModel
{/// <summary>/// 编号/// </summary>public string TicketNum { get; set; }/// <summary>/// 出发站/// </summary>public string StartStation { get; set; }/// <summary>/// 到达站/// </summary>public string DestinationStation { get; set; }/// <summary>/// 出发时间/// </summary>public string Date { get; set; }/// <summary>/// 车次/// </summary>public string TrainNum { get; set; }/// <summary>/// 座位号/// </summary>public string Seat { get; set; }/// <summary>/// 乘车人姓名/// </summary>public string Name { get; set; }/// <summary>/// 票价/// </summary>public string Price { get; set; }/// <summary>/// 席别/// </summary>public string SeatCategory { get; set; }/// <summary>/// 身份证号/// </summary>public string ID { get; set; }/// <summary>/// 发票消费类型/// </summary>public string InvoiceType { get; set; }/// <summary>/// 序列号/// </summary>public string SerialNumber { get; set; }/// <summary>/// 加收票价/// </summary>public string AdditionalCost { get; set; }/// <summary>/// 手续费/// </summary>public string HandlingFee { get; set; }/// <summary>/// 大写金额(票面有大写金额该字段才有值/// </summary>public string LegalAmount { get; set; }/// <summary>/// 售票站/// </summary>public string TicketStation { get; set; }/// <summary>/// 原票价(一般有手续费的才有原始票价字段)/// </summary>public string OriginalPrice { get; set; }/// <summary>/// 发票类型:火车票、火车票补票、火车票退票凭证/// </summary>public string InvoiceStyle { get; set; }/// <summary>/// 收据号码/// </summary>public string ReceiptNumber { get; set; }/// <summary>/// 仅供报销使用:1为是,0为否/// </summary>public string IsReceipt { get; set; }/// <summary>/// 唯一请求 ID,由服务端生成/// </summary>public string RequestId { get; set; }
}
界面设计
这里增加一个图片地址的输入框和查询按钮,另外增加一个分组展示解析结果,具体后台代码如下:
/// <summary>/// 查询代码/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSearch_Click(object sender, EventArgs e){string url = txtImageUrl.Text;if (string.IsNullOrWhiteSpace(url)){MessageBox.Show("请输入查询车票图片的URL");}else{TrainTicketRecognitionModel model = TrainTicketRecognitionUtils.GetTicketStr(url);txtStartStation.Text = model.StartStation;txtDestinationStation.Text = model.DestinationStation;txtDate.Text = model.Date;txtTrainNum.Text= model.TrainNum;txtPrice.Text = model.Price;txtSeat.Text = model.Seat;txtSeatCategory.Text = model.SeatCategory;txtName.Text = model.Name;}}
查询结果如下:
三、总结
通过以上案例可以轻松实现火车票信息识别提取的功能,以上案例代码提供的比较完整,如果大家还有问题的话欢迎沟通交流!
阅读原文
相关文章:

C#实战:使用腾讯云识别服务轻松提取火车票信息
目录 一、腾讯票据单据识别 Invoice OCR服务介绍 二、开发完整流程 2.1 开通文字识别服务 2.2 创建开发者密钥 2.3 创建项目编写代码集成 三、总结 公司内部涉及到车票报销的时候一个个输入火车票信息非常麻烦,尤其是出差比较多的企业,这对于财务人…...

王珊数据库系统概论第六版PDF+第五版课后答案+课件
为了保持科学性、先进性和实用性, 编者在第5版教材基础上对全书内容进行了修改、更新和充实。在科学性方面, 编者在系统篇中增加了第9章关系数据库存储管理, 讲解数据库的逻辑与物理组织方式及索引结构。增加这部分内容有助于学生更好地理解关…...

Spring学习笔记(四)
二十一、Spring事务详解 (一)、Spring基于XML的事务配置 1.环境搭建 1.1 构建maven工程,添加相关技术依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context…...

CALL处 F8的“bug“
看zpchcbd师傅的一篇文章看到了这个比较有趣的点。实操跟着过一遍。 准确来说这个不能说是"bug",这可以是一种"刻意为之"的手段,可以用于加壳、反调试等逆向技术中。 原理: F8步过call的时候,其实是在call的…...
Verilog中的有符号数与无符号数
1. 有符号与无符号最本质的区别在于高位扩展时的扩展规则不同; 对于同一个4‘b1001进行位扩展成8位: 有符号扩展结果为:8’b11111001 无符合扩展结果为: 8b00001001 2. 同第一点,若在运算中没有涉及位扩展,则有符…...
15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!
第47天的学习:并发进阶——深入了解Go语言的并发模型! 目录 Go并发模型简介Goroutines深度讲解Channels的进阶使用Select语句详解并发模型设计模式实战案例分析常见问题与解决方案 1. Go并发模型简介 Go语言以其内置的并发支持而闻名。通过轻量级的g…...

前端代码分析题(选择题、分析题)——this指向、原型链分析
this指向 普通函数:this 的指向由调用方式决定,可以是全局对象、调用该函数的对象,或者显式指定的对象。箭头函数:this 的指向在定义时确定,始终继承自外层函数作用域的 this,不会被调用方式影响。 var obj…...
react 组件应用
文章目录 react 组件react 中组件 hook 函数应用useMemo技术细节(useMemo 钩子函数和 useCallback 钩子函数)小结(依赖性数组应用) react 组件 函数式组件实例及应用场景 实例: 以下是一个简单的函数式组件,用于显示一个欢迎消息。 import React from re…...
mysql 快速解决死锁方式
mysql 快速解决死锁方式 直接寻找并终止导致死锁的具体 SQL 语句是处理死锁的一种有效方法,特别是在高并发环境中。以下步骤和示例展示了如何通过识别、分析和终止长时间运行的 SQL 语句来解决死锁问题。 一、识别那个导致死锁的 SQL 语句 1. 使用 SHOW ENGINE I…...

RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 RabbitMQ 初识 1.1 RabbitMQ 安装 2.0 数据隔离 2.1 用户管理 2.2 virtual host 虚拟主机 3.0 SpringAMQP 3.1 RabbitMQ 配置 3.2 发送消息 3.3 接收消息 3.4 Wor…...

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析
在WPF(Windows Presentation Foundation)中,数据绑定机制是其核心功能之一,广泛用于连接应用程序的UI(用户界面)和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源(如对象、集合或其他数…...
pwn学习笔记(12)--Chunk Extend and Overlapping
pwn学习笔记(12)–Chunk Extend and Overlapping chunk extend 是堆漏洞的一种常见利用手法,通过 extend 可以实现 chunk overlapping(块重叠) 的效果。这种利用方法需要以下的时机和条件: 程序中存在…...
java基础面试题六集合框架
目录 1. List,Set,Map是否继承自collection接口? 2. 说说List,Set,Map三者的区别 3. 写出list、map、set接口的实现类,并说出其特点 4. 常见集合类的区别和适用场景 5. 集合的父类是谁?哪些安全的? 6…...

2024年12月一区SCI-指数-三角优化算法ETO-附Matlab免费代码
引言 本期介绍了一种基于数学概念的元启发式优化算法,称为指数-三角优化算法Exponential-trigonometric optimization algorithm,ETO。该算法基于指数函数和三角函数的复杂组合,于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊Computer…...
设置服务器ssh连接超时时间
在Linux服务器上,您可以通过修改SSH服务器配置文件来设置SSH连接的超时时间。以下是设置SSH连接超时时间的一些步骤: 打开SSH服务器配置文件。这个文件通常是/etc/ssh/sshd_config。sudo nano /etc/ssh/sshd_config在配置文件中,您可以设置以…...

Dubbo分布式日志跟踪实现
前言 随着越来越多的应用逐渐微服务化后,分布式服务之间的RPC调用使得异常排查的难度骤增,最明显的一个问题,就是整个调用链路的日志不在一台机器上,往往定位问题就要花费大量时间。如何在一个分布式网络中把单次请求的整个调用日…...

EPSON机械手与第三方相机的校准功能设计By python
EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…...
探索 Java 23:新时代的编程利器
一、引言 随着技术的不断发展,Java 作为一种广泛应用的编程语言也在不断演进。Java 23 的推出带来了许多令人兴奋的新特性和改进,为开发者提供了更多的工具和功能,以应对日益复杂的软件开发挑战。本文将深入介绍 Java 23 的各个方面。 二、J…...
CSS3_3D变换(七)
1、CSS3_3D变换 1.1 3D空间与景深 3D空间:在父元素中将属性transform-style设置为preserve-3d开启3D空间,默认值为flat(开启2D空间); 景深:人眼与平面的距离,产生透视效果,使得效果…...

Mesh网格
Mesh(网格) 定义:Mesh 是一个包含顶点、三角形、顶点法线、UV坐标、颜色和骨骼权重等数据的对象。它定义了3D模型的几何形状。 功能: 顶点(Vertices):构成3D模型的点。 三角形(Triangles)&…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...