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

C# 识别二维码

文章目录

  • 一. 二维码识别技术概述
  • 二 维码识别的步骤
    • 图像预处理
    • 二维码的定位和检测
    • 二维码解码
  • 三 常用的二维码识别库
    • 1. OpenCV
    • 2. ZXing.Net

一. 二维码识别技术概述

 二维码是一种通过黑白矩阵排列来编码数据的图形符号,它的编码方式具有较强的容错性,可以在一定程度上恢复损坏的数据。二维码识别技术是通过扫描二维码图像,解析其中的信息并返回解码内容。

二维码识别过程一般可以分为以下几个步骤:

  1. 图像预处理:包括灰度化、去噪、二值化等操作,使图像适合进行后续的二维码检测。
  2. 二维码检测:识别图像中的二维码区域,确定二维码的边界。
  3. 二维码解码:从检测到的二维码区域中提取数据。

二 维码识别的步骤

图像预处理

 二维码图像可能会受到噪声、模糊、光线等因素的影响,因此在开始识别之前,需要对图像进行一些预处理操作:

  • 灰度化:将彩色图像转换为灰度图像,减少计算复杂度。
  • 去噪:去除图像中的噪点,常用方法包括高斯滤波、中值滤波等。
  • 二值化:将灰度图像转换为黑白二值图像,使二维码与背景之间的对比更加明显。常见的二值化方法有 Otsu 阈值法和自适应阈值法。

二维码的定位和检测

 在处理过的图像中,我们需要定位二维码的位置。二维码通常由一个矩形框和一些图案标识符组成,因此其边缘检测是非常重要的。识别算法通常会通过以下方式来检测二维码:

  • 轮廓检测:通过轮廓检测算法(如 OpenCV 中的 findContours)来寻找二维码的四个角点。
  • 边缘检测:使用 Canny 边缘检测或 Sobel 算子提取二维码区域的边缘特征。
  • 几何特征匹配:二维码通常有固定的几何结构,如定位符、格式信息、数据区域等。通过匹配这些已知的几何特征来确定二维码位置。

二维码解码

 一旦检测到二维码的四个角点,接下来的任务是解码二维码中的数据。二维码的编码方式采用了 Reed-Solomon 编码技术,具有较强的容错能力,能够从部分损坏或模糊的二维码中恢复数据。解码过程包括:

  • 提取二维码图像中的数据区域。
  • 照二维码的标准解码格式解析数据并还原原始信息。

三 常用的二维码识别库

 虽然二维码的识别可以通过自己实现图像处理算法来完成,但在实际开发中,我们可以使用一些开源库来简化这一过程。这些库已经封装了大部分二维码识别所需的功能,极大地提高了开发效率。

1. OpenCV

 OpenCV 是一个流行的开源计算机视觉库,提供了强大的图像处理和计算机视觉功能。它提供了QRCodeDetector类,可以用来检测和解码二维码。

代码示例

Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);// 转为灰度图像
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);// 高斯模糊,去噪
Cv2.GaussianBlur(gray, gray, new OpenCvSharp.Size(9, 9), 2, 2);
// 2. 初始化二维码检测器
QRCodeDetector qrDecoder = new QRCodeDetector();Mat temp=new Mat();
// 3. 检测并解码二维码
string decodedText = qrDecoder.DetectAndDecode(gray, out Point2f[] points, temp);if (!string.IsNullOrEmpty(decodedText))
{// 4. 在二维码上绘制边框if (points.Length > 0){for (int i = 0; i < points.Length; i++){OpenCvSharp.Point pt1 = new OpenCvSharp.Point((int)points[i].X, (int)points[i].Y);OpenCvSharp.Point pt2 = new OpenCvSharp.Point((int)points[(i + 1) % points.Length].X, (int)points[(i + 1) % points.Length].Y);Cv2.Line(src, pt1, pt2, new Scalar(0, 255, 0), 2);}// 在二维码中心绘制解码文本OpenCvSharp.Point center = new OpenCvSharp.Point((int)((points[0].X + points[2].X) / 2), (int)((points[0].Y + points[2].Y) / 2)-150);Cv2.PutText(src, decodedText, center, HersheyFonts.HersheySimplex, 5, new Scalar(0, 0, 255), 2);pictureBox2.Image = MatToBitmap(src);}
}

在这里插入图片描述

2. ZXing.Net

 ZXing.Net 是一个轻量级的二维码识别库,支持多种条形码格式,包括二维码。它不仅支持二维码的解码,还能解析条形码、Data Matrix 等其他编码格式。
代码示例(使用 ZXing.Net 识别二维码)

using ZXing;var barcodeReader = new BarcodeReader();
var result = barcodeReader.Decode(new Bitmap("qrcode_image.jpg"));if (result != null)
{Console.WriteLine($"二维码内容: {result.Text}");
}
else
{Console.WriteLine("未检测到二维码");
}

相关文章:

C# 识别二维码

文章目录 一. 二维码识别技术概述二 维码识别的步骤图像预处理二维码的定位和检测二维码解码 三 常用的二维码识别库1. OpenCV2. ZXing.Net 一. 二维码识别技术概述 二维码是一种通过黑白矩阵排列来编码数据的图形符号&#xff0c;它的编码方式具有较强的容错性&#xff0c;可以…...

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…...

RK3588 , mpp硬编码rgb, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp...

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中&#xff0c;Wireshark 凭借其强大的捕获和显示功能&#xff0c;成为协议分析不可或缺的工具。然而&#xff0c;面对众多未被内置支持的协议或需要扩展解析的场景&#xff0c;Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…...

ElasticSearch08-分析器详解

零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器&#xff08;Analyzer&#xff09;是全文搜索的核心组件&#xff0c;它负责将文本转换为一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。 &#xff08;1&#xff…...

【IN、NOT、AND、OR】在 MySql 中的使用方法,使用场景、注意事项

目录 IN NOT AND OR 注意事项&#xff1a; 使用场景&#xff1a; IN 用于指定某个字段的值在一个预定义的列表中。 SELECT * FROM users WHERE age IN (20, 25, 30);查询返回 age 字段 是20、25 、30 的用户记录。 NOT 用于对条件进行否定。 查询将返回与指定 条件相…...

Face to face

1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...

宝塔配置python项目提示python版本与安装的不符

用宝塔的网站添加了项目&#xff0c;配置选择了python3.8&#xff0c;但是在终端并且进入了虚拟环境查看python的版本居然还是默认是2.7.5版本。 官方是举列说明&#xff0c;这张图是用python管理器生成的 而我用的 网站--python项目&#xff0c; 那么虚拟路径在 /www/serve…...

Restaurants WebAPI(一)—— clean architecture

文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...

c++数据结构算法复习基础--13--基数算法

基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位&#xff08;个位、十位。。。&#xff09;&#xff0c;所以取值范围就为0-9。 根据该特点&#xff0c;设计桶的概念 – 0号桶、1号桶… 1、思想 1&#xff09;找出最长的数字&#xff0c;确定要处理的…...

ntp设置

NTP&#xff08;Network Time Protocol&#xff09;简介 ntp授时定义 - NTP是一种用于在计算机网络中同步时间的协议。它确保网络中的各个设备&#xff08;如服务器、客户端计算机、网络设备等&#xff09;的时钟保持准确一致。 - 其工作原理是通过分层的时钟源体系&#xff…...

如何在Java中使用封装好的API接口?

1.选择合适的 HTTP 库 在 Java 中&#xff0c;可以使用多种库来进行 HTTP 请求。java.net.HttpURLConnection是 Java 标准库中的类&#xff0c;能够满足基本的 HTTP 请求需求&#xff0c;但使用起来相对复杂。另外&#xff0c;还有一些第三方库&#xff0c;如OkHttp和Apache H…...

AWS EKS 相关错误修复 - remote error: tls: internal error - CSR pending

现象 升级aws eks的kubernetes版本后执行kubectl logs 或者kubectl exec相关命令会出现报错 remote error: tls: internal error 执行kubectl get csr -A查看csr出现一直pending的状态,并且出现问题的pod都在新创建出来的eks node节点上 kubectl get csr -A NAME AGE …...

浏览器事件循环机制

JavaScript 是单线程运行的语言&#xff0c;同一时间只能执行一个任务。单线程意味着&#xff1a; 如果某个任务执行时间过长&#xff0c;后续任务会被阻塞。 同步任务和异步任务的调度需要一种机制来管理。 为了解决这个问题&#xff0c;事件循环应运而生&#xff0c;它可以…...

ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程

本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…...

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…...

【排序算法】——插入排序

目录 前言 简介 基本思想 1.直接插入排序 2.希尔排序 代码实现 1.直接插入排序 2.希尔排序 总结 1.时空复杂度 2.稳定性 尾声 前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&…...

MySQL的并发控制与MVCC机制深度解析

目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC&#xff08;多版本并发控制&#xff09;机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点&#xff1a;缺点&#xff1a; 7. MVCC在…...

Qt编译MySQL数据库驱动

目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 &#xff08;1&#xff09;先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 &#xff08;2&#xff09;在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…...

uniapp地址类 方法

关于点击没反应 manifest.json 检查是否添加了对应的权限 /* 小程序特有相关 */"mp-weixin" : {"appid" : "wxc481f10754f1d9df","setting" : {"urlCheck" : false,"es6" : true,"postcss" : true,&qu…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...