.NET WinForm图像识别二维码/条形码并读取其中内容

需求:图像识别出一张图片中的二维码或者条形码,并读取其中内容。

一、安装库(特别注意,网上很多都没说清楚)

如果是基于.net framework,则安装ZXing.Net(建议0.14.0版本左右,具体看实际,版本太高,部分接口发生变化)
如果是基于.Net Standard 2.0 or .NET CORE 3.0/3.1 or .NET 5.0 or higher,则安装ZXing.Net.Bindings.Windows.Compatibility

二、WinForm示例代码(含关键优化)

using ZXing.Common;
using ZXing;
using ZXing.Windows.Compatibilitypublic partial class MainForm : Form
{public MainForm(){InitializeComponent();}// 选择图片按钮点击事件private void btnSelectImage_Click(object sender, EventArgs e){OpenFileDialog dialog = new OpenFileDialog();dialog.Filter = "图片文件|*.jpg;*.png;*.bmp";if (dialog.ShowDialog() == DialogResult.OK){pictureBox1.Image = Image.FromFile(dialog.FileName);}}// 识别条码按钮点击事件private void btnDecode_Click(object sender, EventArgs e){if (pictureBox1.Image == null){MessageBox.Show("请先选择图片");return;}var bitmap = new Bitmap(pictureBox1.Image);// 创建解码器(关键配置)var reader = new BarcodeReader{Options = new DecodingOptions{PossibleFormats = new[] { BarcodeFormat.QR_CODE, BarcodeFormat.CODE_128,  // 条形码BarcodeFormat.EAN_13 },TryHarder = true,      // 提高复杂图像识别率CharacterSet = "UTF-8" // 支持中文}};// 识别条码(支持多码)Result[] results = reader.DecodeMultiple(bitmap);if (results != null){foreach (Result result in results){txtResult.AppendText($"✅ 识别成功!类型:{result.BarcodeFormat},内容:{result.Text}\r\n");}}else{txtResult.Text = "❌ 识别失败:未检测到有效条码";}}
}

在这里插入图片描述

三、识别率优化技巧

//1. 图像预处理(解决模糊/低对比度问题)
csharp
// 转换为灰度图+二值化
var luminanceSource = new BitmapLuminanceSource(bitmap);
var binarizer = new HybridBinarizer(luminanceSource);
var binBitmap = new BinaryBitmap(binarizer);Result result = reader.Decode(binBitmap); // 使用处理后的图像
//2. 多尺度识别(针对小尺寸条码)
csharp
for (double scale = 1.0; scale <= 2.0; scale += 0.2)
{var scaledBitmap = new Bitmap(bitmap, new Size((int)(bitmap.Width * scale), (int)(bitmap.Height * scale)));Result result = reader.Decode(scaledBitmap);if (result != null) break;
}
//3. 区域裁剪(复杂背景中定位条码)
csharp
// 假设已知条码在图像右下角1/4区域
Rectangle cropArea = new Rectangle(bitmap.Width / 2, bitmap.Height / 2, bitmap.Width / 2, bitmap.Height / 2
);using (Bitmap cropped = bitmap.Clone(cropArea, bitmap.PixelFormat))
{Result result = reader.Decode(cropped);
}

四、常见问题解决

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Guava限频器RateLimiter的使用示例

文章目录 1. 背景说明2. API与方法3. 示例代码3.1 基础工具方法3.2 测试任务类3.3 测试和统计方法3.4 测试两种模式的限频器3.5 测试缓冲时间与等待耗时 4. 完整的测试代码5. 简单小结 1. 背景说明 高并发应用场景有3大利器: 缓存、限流、熔断。 也有说4利器的: 缓存、限流、…

(面试)获取View宽高的几种方式

Android 中获取 View 宽高的几种方式&#xff0c;以及它们的适用场景和注意事项&#xff1a; 1. View.getWidth() 和 View.getHeight() 原理: 直接从 View 对象中获取已经计算好的宽度和高度。 优点: 简单直接。 缺点: 在 onCreate()、onStart() 等生命周期方法中&#xff0…

PostgreSQL pgrowlocks 扩展

PostgreSQL pgrowlocks 扩展 pgrowlocks 是 PostgreSQL 的一个系统扩展&#xff0c;用于显示表中行级锁定信息。这个扩展特别适合诊断锁争用问题和性能调优。 一、扩展安装与启用 1. 安装扩展 -- 使用超级用户安装 CREATE EXTENSION pgrowlocks;2. 验证安装 -- 查看扩展是…

JavaSE知识总结 ~个人笔记以及不断思考~持续更新

目录 字符串常量池 如果是创建对象还会吗&#xff1f; Integer也是在字串常量池中复用&#xff1f; 字符串拼接 为什么String是不可变的&#xff1f; String的不可变性是怎么做的&#xff1f; 外部代码不能创建对象&#xff1f; 构造方法不是私有的吗&#xff1f; 怎么…

使用HTTPS进行传输加密

文章目录 说明示例&#xff08;公网上的公开web&#xff09;安装SSL证书Certbot 的 Webroot 模式 和 Standalone 模式的区别**Webroot 模式****Standalone 模式** 技术对比表Node.js 场景下的最佳实践推荐方案&#xff1a;**Webroot 模式**Standalone 模式应急使用&#xff1a;…

驱动开发(2)|鲁班猫rk3568简单GPIO波形操控

上篇文章写了如何下载内核源码、编译源码的详细步骤&#xff0c;以及一个简单的官方demo编译&#xff0c;今天分享一下如何根据板子的引脚写自己控制GPIO进行高低电平反转。 想要控制GPIO之前要学会看自己的引脚分布图&#xff0c;我用的是鲁班猫RK3568&#xff0c;引脚分布图如…

ArcGIS Pro 3.4 二次开发 - 布局

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 布局1 布局工程项1.1 引用布局工程项及其关联的布局1.2 在新视图中打开布局工程项1.3 激活已打开的布局视图1.4 引用活动布局视图1.5 将 pagx 导入工程1.6 移除布局工程项1.7 创建并打开一个新的基本布局1.8 使用修改后的CIM创建新…

OpenCV 图像像素的算术操作

一、知识点 1、operator (1)、MatExpr operator (const Mat & a, const Mat & b); a、a和b的行数、列数、通道数得相同。 b、a和b的每个像素的每个通道值分别相加。 (2)、MatExpr operator (const Mat & a, const Scalar & s); a、若a…

音视频中的复用器

&#x1f3ac; 什么是复用器&#xff08;Muxer&#xff09;&#xff1f; 复用器&#xff08;muxer&#xff09;是负责把音频、视频、字幕等多个媒体流打包&#xff08;封装&#xff09;成一个单一的文件格式的组件。 &#x1f4a1; 举个形象的例子&#xff1a; 假设你有两样东…

数据库安全性

一、计算机安全性概论 &#xff08;一&#xff09;核心概念 数据库安全性&#xff1a;保护数据库免受非法使用导致的数据泄露、更改或破坏&#xff0c;是衡量数据库系统的关键指标之一&#xff0c;与计算机系统安全性相互关联。计算机系统安全性&#xff1a;通过各类安全保护…

【Linux网络编程】网络层IP协议

目录 IP协议的协议头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 IP协议的协议头格式 4位版本号 &#xff1a;指定IP协议的版本&#xff0c;对于IPv4&#xff0c;版本号就是4。 4位首部长度&#xff1a;表名IP协议报头的长度&#xff0c;单…

“候选对话链”(Candidate Dialogue Chain)概念

目录 一、定义与形式 二、生成过程详解 1. 语言模型生成&#xff08;LLM-Based Generation&#xff09; 2. 知识图谱支持&#xff08;KG-Augmented Generation&#xff09; 3. 策略调控&#xff08;Policy-Driven Planning&#xff09; 三、候选对话链的属性 四、候选对…

Unity中的JsonManager

1.具体代码 先贴代码 using LitJson; using System.IO; using UnityEngine;/// <summary> /// 序列化和反序列化Json时 使用的是哪种方案 有两种 JsonUtility 不能直接序列化字典 ligJson可以序列化字典 /// </summary> public enum JsonType {JsonUtilit…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— SplitLandingPage 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 在这篇文章中&#xff0c;我们将实现一个交互式的左右面板…

机器学习-ROC曲线​​ 和 ​​AUC指标

1. 什么是ROC曲线&#xff1f;​​ ROC&#xff08;Receiver Operating Characteristic&#xff0c;受试者工作特征曲线&#xff09;是用来评估​​分类模型性能​​的一种方法&#xff0c;特别是针对​​二分类问题​​&#xff08;比如“患病”或“健康”&#xff09;。 ​…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…

手写ArrayList和LinkedList

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬&#xff1a;https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…

每日c/c++题 备战蓝桥杯(Cantor 表)

Cantor 表的探究与实现 在数学中&#xff0c;有理数的可枚举性是一个令人惊叹的结论。今天&#xff0c;就让我们一起深入探讨这个经典问题&#xff0c;并分享一段精心编写的代码&#xff0c;揭开这一数学奥秘的神秘面纱。 问题背景 在 19 世纪末&#xff0c;伟大的数学家康托…

解决idea与springboot版本问题

遇到以下问题&#xff1a; 1、springboot3.2.0与jdk1.8 提示这个包org.springframework.web.bind.annotation不存在&#xff0c;但是pom已经引入了spring-boot-starter-web 2、Error:Cannot determine path to tools.jar library for 17 (D:/jdk17) 3、Error:(3, 28) java: …

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…