C# opencv识别二维码

news2024/9/28 3:30:50

新建桌面程序

在这里插入图片描述
在这里插入图片描述

安装opencvsharp

在这里插入图片描述

拖拽设计页面

在这里插入图片描述

选择图片识别代码

using OpenCvSharp;
using System.Text;

namespace QRcodeIdentity
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 选择图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void selectBtn_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            // 设置文件对话框的标题  
            openFileDialog.Title = "选择图片";
            // 设置文件类型过滤器  
            // 注意这里"PNG 图片 (*.png)|*.png|JPG 图片 (*.jpg)|*.jpg"的写法  
            // "|"用于分隔不同的过滤器,每个过滤器由“描述|文件扩展名”组成  
            openFileDialog.Filter = "PNG 图片 (*.png)|*.png|JPG 图片 (*.jpg)|*.jpg";
            // 设置默认文件类型过滤器为第一个(PNG 图片)  
            openFileDialog.FilterIndex = 1;
            // 显示文件对话框  
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                this.imgPathTxt.Text = openFileDialog.FileName;
            }
        }

        /// <summary>
        /// 识别图片中的二维码位置和内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void runBtn_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.imgPathTxt.Text))
            {
                MessageBox.Show("请选择图片");
                return;
            }
            var src = Cv2.ImRead(this.imgPathTxt.Text);
            //图像灰度
            Mat gray = new Mat();
            Cv2.CvtColor(src, gray, ColorConversionCodes.BGRA2GRAY);
            //Cv2.ImShow("gray", gray);
            //二值化
            Mat threshold = new Mat();
            //Cv2.AdaptiveThreshold(gray, threshold, 255.0, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 13, 2);
            Cv2.Threshold(gray, threshold, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);
            //Cv2.ImShow("threshold", threshold);
            //绘制轮廓

            //截取二维码有效区域
            //识别二维码
            QRCodeDetector qRCodeDetector = new QRCodeDetector();
            Point2f[] point2Fs;
            //Cv2.ImShow("gray", gray);
            Mat mat = new Mat();
            /*
             img 为输入图像,灰度或者彩色图像;
            points 是二维码ROI最小外接矩形顶点坐标;
            straightQrcode 输出的是二维码区域ROI图像信息 返回的二维码utf-8字符串
            返回值是已识别的二维码内容
             */
            string code = qRCodeDetector.DetectAndDecode(src, out point2Fs, mat);
            Cv2.Rectangle(src, new OpenCvSharp.Point((int)point2Fs[3].X, (int)point2Fs[1].Y), new OpenCvSharp.Point((int)point2Fs[2].X, (int)point2Fs[2].Y), new Scalar(0, 255, 255), 2);
            //Cv2.ImShow("src", src);
            // 使用Cv2.ImWrite方法保存Mat对象为图片文件  
            var filePath = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.jpg";
            bool result = Cv2.ImWrite(filePath, src);
            StringBuilder str = new StringBuilder();
            str.AppendLine("识别成功\r\n");
            str.Append($"二维码内容为:{code}\r\n");
            var xLeft = (int)point2Fs[3].X;
            var yTop = (int)point2Fs[1].Y;
            var width = (int)point2Fs[2].X - (int)point2Fs[3].X;
            str.Append($"距离顶部{yTop},距离左侧{xLeft},宽度:{width}");
            this.resultTxt.Text = str.ToString();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

参考

https://blog.csdn.net/qq_37835727/article/details/127809933
https://blog.csdn.net/weixin_63357306/article/details/132830563
https://blog.51cto.com/u_16099252/10915538
https://cloud.tencent.com/developer/article/2420183

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

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

相关文章

STM32——Flash闪存

以上部分&#xff0c;主存储器&#xff1a;程序存储器&#xff1b; 启动程序代码&#xff1a;系统存储器&#xff1b; 用户选择字节&#xff1a;选项字节 以下是闪存的管理员&#xff0c;用于擦除和读写的地址 C8T6一共64K&#xff0c;主存储器为64页 以下是整体框图&#x…

【数据库|第10期】SQL Server、Access和Sqlite 的表别名详解

日期&#xff1a;2024年8月28日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

视频云流化与PaaS平台解决方案详细介绍

一、什么是视频云流化&#xff1f; 视频云流化&#xff08;Video Cloud Transcoding&#xff09;是一种将视频文件转换为适用于流媒体传输的不同格式和码率的过程。它是云计算和流媒体技术的结合&#xff0c;通过利用云平台的计算和存储资源&#xff0c;将视频内容转码为适应不…

什么是时钟偏差—Clock Skew?理解时钟分配网络中的时钟偏差

了解时钟偏差是什么,以及它如何通过理解同步电路、时钟传递和时钟分配网络对现代系统产生影响。 现代数字电子设计的最大挑战之一是能够满足时序约束。在数字电路中,保持可预测且组织良好的操作逻辑流的一种方法是进行精确控制和明确定义时序。 时钟偏差是这些电路设计中需…

Scratch教学案例-《三顾茅庐》:让编程学习如同故事般引人入胜

三顾茅庐-小虎鲸Scratch资源站 在编程的世界里&#xff0c;我们常常寻找那种既能激发创意&#xff0c;又能提升技能的学习方式。今天&#xff0c;小虎鲸Scratch资源站为您带来了一款独特的教学作品——《三顾茅庐》。这是一部将经典故事与编程教学巧妙结合的Scratch项目&#x…

.NET 8.0 前后分离快速开发框架

目录 前言 项目介绍 功能特点 适用范围 内置功能 项目技术 1、前端技术 2、传送门 3、后端技术 项目结构 项目效果 项目地址 最后 前言 大家好&#xff0c;推荐一个.NET 8.0 为核心&#xff0c;结合前端 Vue 框架&#xff0c;实现了前后端完全分离的设计理念。它不…

【Python机器学习】NLP词频背后的含义——隐性狄利克雷分布(LDiA)

目录 LDiA思想 基于LDiA主题模型的短消息语义分析 LDiALDA垃圾消息过滤器 更公平的对比&#xff1a;32个LDiA主题 对于大多数主题建模、语义搜索或基于内容的推荐引擎来说&#xff0c;LSA应该是首选方法。它的数学机理直观、有效&#xff0c;它会产生一个线性变换&#xff…

进程间通信--IPC机制

今天主要讲述独立的进程之间的通信&#xff0c;我们知道&#xff0c;进程是一个完整代码的执行过程&#xff0c;那么我们想实现在进程运行的过程之中传递信息或者是发送数据&#xff0c;就是通过IPC机制来完成。 一、什么是IPC机制 IPC&#xff1a;inter process communication…

文件泄密?不存在的!一文读懂文件防泄密最新五个小妙招

在当今信息化时代&#xff0c;企业数据的安全性显得尤为重要。文件泄密事件频发&#xff0c;不仅会给企业带来巨大的经济损失&#xff0c;还可能损害企业的声誉。因此&#xff0c;如何有效防止文件泄密成为了企业管理中的重中之重。本文将为大家介绍最新的五个防泄密妙招&#…

vue大数据展示之虚拟列表

面试代码学习 父组件&#xff1a; <template><div class"box"><!--items总条数、 size数据高度、 shownumber每次渲染数据--><list :items"items" :size"60" :shownumber"10"></list></div><…

要实现主动元数据,关键技术在算子级血缘解析

主动元数据管理最早被 Gartner 在 2016 年提出&#xff0c;在 2022 年 Gartner 公布的顶级战略技术趋势中&#xff0c;主动元数据被认为是实现 Data Fabric&#xff08;数据编织&#xff09;和主动数据治理的基石&#xff0c;也是实现 Data Fabric 的关键能力 。在这份技术趋势…

全面解析:动态住宅代理的关键优势

在大数据时代的背景下&#xff0c;代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性&#xff0c;而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

关于springboot的Rest请求映射处理的源码分析(二)

前面我们知道了他怎么处理表单映射&#xff0c;这里我们来研究一下&#xff0c;他是如何处理具体请求的。也就是说我有那么多/user你是怎么定位到我在哪个cotroller&#xff0c;并且你是怎么定位到我具体是哪个接口。 这里我们就来逐步定位一下这个问题。 一、组件分析 老路子…

Nacos 部分漏洞整理

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Naco简介 微信公众号搜索:南风漏洞复现文库 该文…

element中 el-input 不更新的问题

需要在上面输入数字,下面一列都更改成一样的数字 batchChange(list,field,value){console.log(list,field,value);list.forEach((i,index) > {i[field]value;this.$set(list,index, JSON.parse(JSON.stringify(i)));});} 用 JSON.parse(JSON.stringify(i)) 转一下后,就可以…

langchain入门系列之八 langgraph多agent示例

在之前的文章中我们介绍了langgraph&#xff0c;并且用它做了一个小小的示例&#xff0c;在本文中&#xff0c;我们将使用智普清言来构建多agent 系统。百度千帆对langgraph支持较差(尤其是强制要求奇数偶数的role设置&#xff0c;传入messages的奇数偶数要求&#xff0c;让人有…

用好外呼机器人,帮助企业提升客户管理效率

外呼机器人&#xff0c;作为现代科技与企业管理的结合体&#xff0c;正在企业客户管理领域掀起革命性的变化。随着人工智能技术的不断进步&#xff0c;外呼机器人不仅实现了自动化呼叫&#xff0c;还能根据客户的语音情感进行相应的反馈和操作&#xff0c;极大地提高了客户满意…

AI大模型编写多线程并发框架(六十三):监听器优化·上

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第七轮对话-补充异步执行代码三、第八轮对话-增加累计完成等字眼四、第九轮对话-线程安全优化五、第十轮对话-增加运行时数据七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它…

SpringBoot+Vue的图书管理系统【包含运行步骤】

SpringBootVue图书管理系统 一、项目介绍1. 图书信息管理2. 图书类型管理3. 图书借阅管理4. 用户管理 二、技术选型后端技术选型前端技术选型 三、运行步骤后端启动前端启动 四、项目演示源码获取方式 五、总结与展望 大家好&#xff0c;这里是程序猿代码之路&#xff01;随着信…

Linux基础1-基本指令7(其他常用指令,shell简介)

目录 1.uname 2.常用小指令 3.查看系统信息的其他指令 4.shell命令及其原理 4.1这里我们简单了解一下shell 4.2 shell存在的意义&#xff1f; 1.uname 如何查看计算机体系架构&#xff1f; uname -a,查看详细信息 uname -r 查看简要信息 2.常用小指令 TAB&#x…