c# 基于微信wechat_qrcode opencv插件,网络二维码图片批量识别(一)

news2025/1/13 14:27:29

一、基本概念

    微信开源了其二维码的解码功能,并贡献给 OpenCV 社区。其开源的 wechat_qrcode 项目被收录到 OpenCV contrib 项目中。从 OpenCV 4.5.2 版本开始,就可以直接使用。
该项目 github 地址:

 https://github.com/opencv/opencv_contrib/tree/master/modules/wechat_qrcode

模型文件的地址:

 https://github.com/WeChatCV/opencv_3rdparty

微信的扫码引擎,很早就支持了远距离二维码检测、自动调焦定位、多码检测识别等功能,它是基于 CNN 的二维码检测。

二、测试接口:

http://helpnow.top:92/qr?key=234181402307&url=http://helpnow.top/wm.jpg

其中url为图片地址。支持高并发、多线程批量识别网络二维码图片。

三、基本原理及源代码


1、识别本地图片文件
  调用c++ dll识别图片文件,返回字符串结果
       ///<summary>
        ///识别图片文件,返回结构数据体
        ///result:识别结果,文本字符串
        ///x1,y1:二维码左上角坐标;
        ///x2,y2:二维码右下角坐标;
        ///</summary>
        public struct Result
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]//4
            public string result;
            public float x1;
            public float y1;
            public float x2;
            public float y2;
        }

        public extern static bool DecodeFile(IntPtr path, [Out] Result[] re);
        [DllImport("qrdecode.dll", CallingConvention = CallingConvention.Cdecl)]

  /// <summary>
        /// 识别本地二维码图片文件
        /// </summary>
        /// <param name="filename">图片文件路径</param>
        /// <returns>解码后的字符串</returns>
        public static string DetectFile(string filename)
        {
            string result = "error";
            if (filename == null) return result;
            if (!File.Exists(filename))
            {
                Log.i("文件不存在!");
                return result;
            }
            try
            {
                IntPtr imgpath = Marshal.StringToHGlobalAnsi(filename);
                Result[] res = new Result[20];
                bool b = DecodeFile(imgpath, res);
                if (!b)
                {
                    result = "没有二维码";
                    return result;
                }
                result = res[0].result;
                return result;

            }
            catch (Exception e)
            {
                Log.i(e.ToString());
                return result;
            }

        }


        /// <summary>
        /// char数组转字符串
        /// </summary>
        /// <param name="chars">char[]数组</param>
        /// <returns>string 字符串</returns>
        public static string CharsToString(char[] chars)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char c in chars)
            {
                if (c == 13) break;
                if (c == 0) break;
                sb.Append(c);
            }
            string result = sb.ToString();
            return result;
        }

2、识别网络图片链接


先通过图片链接,获取图片byte数据(byte[]),然后调用c++ dll识别。

        public extern static bool DecodeData(IntPtr data, int len, [Out, MarshalAs(UnmanagedType.LPArray)] char[] result);
        [DllImport("qrdecode.dll", CallingConvention = CallingConvention.Cdecl)]


   /// <summary>
        /// (异步)获取网络图片
        /// </summary>
        /// <param name="url">图片链接</param>
        /// <returns>byte数据组</returns>
        public static async Task<byte[]?> GetBytesAsync(string url)
        {
            HttpClient client = new HttpClient();
            try
            {
                client.Timeout = TimeSpan.FromSeconds(30);
                return await client.GetByteArrayAsync(url);
                //return result;
            }
            catch (Exception e)
            {
                Log.i(e.ToString());
                return null;
            }
            finally 
            {
                client.Dispose();
            }
        }


  /// <summary>
        /// (异步)识别网络二维码图片,需要完整源码的+~~V
        /// </summary>
        /// <param name="url">图片链接地址</param>
        /// <returns>二维码字符串</returns>
        public static async Task<string> DetectUrlAsync(string url)
        {
            string result = "error";
            try
            {
                byte[]? data = await NetHelper.GetBytesAsync(url);
                if (data == null)
                {
                    result = "下载图片失败";
                    return result;
                }
                int len = data.GetLength(0);
                if (len == 0) return result;

                IntPtr ptr = Marshal.AllocHGlobal(len);
                Marshal.Copy(data, 0, ptr, len);
                char[] res= new char[1024];

                bool b = await Task.Run(() => DecodeData(ptr, len, res));
                if (b) 
                {
                    result = Funcs.CharsToString(res);
                }
                else
                {
                    result = "识别失败";
                }
                return result;
            }
            catch (Exception e)
            {
                Log.i(e.ToString());
                return result;
            }

        }

3、接口地址

http://helpnow.top:92/qr?key=234181402307&url=

四、成品


功能包括:
●基于微信wechat_qrcode开源opencv微信二维码扫码识别插件;
●本地二维码图片识别;
●网络二维码图片识别;
●网络二维码图片识别接口:
http://helpnow.top:92/qr?key=234181402307&url=http://helpnow.top/wm.jpg
●支持高并发、多线程识别。返回识别后的字符串;
●无需安装即可使用;
下载地址:
http://helpnow.top/qr

 

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

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

相关文章

中国电子学会2023年05月份青少年软件编程C++等级考试试卷二级真题(含答案)

一、编程题(共5题&#xff0c;共100分) 1. 数字放大 给定一个整数序列以及放大倍数x&#xff0c;将序列中每个整数放大x倍后输出。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 【输入】 包含三行&#xff1a; 第一行为N&#xff0c;表示整数序列的长度(N ≤ 100)&a…

yandex地图js学习

由于百度地图在国外的某些寻路的场景不太完善&#xff0c;所以试用了一下俄罗斯的开源地图。同google地图一样&#xff0c;规划路线需要申请apikey&#xff0c;但无需绑定信用卡&#xff0c;每天的免费调用次数也非常够用。 yandex maps开发文档 申请apikey 只需要创建账号&…

5.5.4 从IPv4到IPv6过渡——双协议栈

5.5.4 从IPv4到IPv6过渡——双协议栈 与软件版本更新不同&#xff0c;IP协议版本的更新不可能在短时间内完成&#xff0c;只能够采用逐步演进的方法&#xff0c;也就是说在很长一段时间内&#xff0c;必须允许两种协议的网络并存&#xff0c;并且能够确保网络能够互联互通&…

C++11语法杂记(更新中)

文章目录 一. delctype二. default三. delete四. 可变参数模板五. emplace系列六. noexcept七. constexpr 一. delctype delctype和auto类似&#xff0c;也可以自动识别类型 举例如下&#xff1a; 与auto不同的是&#xff0c;auto只能用于定义变量类型&#xff0c;而decltyp…

查看ResultSet中的rowData

之前的dml语句都返回值都是int表示有改动的行数 那么Select可是要展示数据的 SELECT查询的结果 通过这个ResultSet遍历 然后通过next方法来一行行读取数据 类似于迭代器(肯定不是迭代器) 里面还包含获得的数据元素 相当于这个既包含元素&#xff0c;还能迭代自己的元素 具体你…

MySQL——DQL,DCL语言学习

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 前言 本章将会讲解MySQLDQL&#xff0c;DCL语言的学习。 一.DQL DQL 英文全称是 Data …

全志V3S嵌入式驱动开发(五种镜像烧入的方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于v3s的镜像烧入&#xff0c;大约有五种方法。前面陆陆续续已经介绍了三种方法&#xff0c;实际工作中具体使用哪一种&#xff0c;大家可以根据自…

SpringBoot 监控与管理的主要组件

SpringBoot 监控与管理的主要组件 SpringBoot作为一款开箱即用的Java Web开发框架&#xff0c;集成了很多方便开发者使用的组件。其中一个非常重要的组件就是监控与管理组件。在现代的分布式应用中&#xff0c;监控与管理已经成为了必不可少的一部分。SpringBoot提供了一些非常…

指针与数组--动态数组(1)[1、C程序的内存映像 2、动态内存分配]

目录 一、C程序的内存映像 二、动态内存分配 1、malloc&#xff08;&#xff09;函数 2、calloc&#xff08;&#xff09;函数 3、free&#xff08;&#xff09;函数 4、realloc&#xff08;&#xff09;函数 一、C程序的内存映像 一个编译后的C程序 获得并使用4块在逻辑上不…

vue+leaflet 使用js自定义封装动画marker样式点

效果图 1. 引入leaflet import L from leaflet2. 使用原生js实现 import L from leaflet; import ../assets/css/blinkmarker.css; L.blinkMarker (point, property) > {// 使用js标签,便于操作,这个temDivEle的作用是将divEle通过innerHTML的方式获取为字符串var temp…

Nacos 打通 CMDB 实现就近访问

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

小程序 体验版 快速配置https服务接口 - 项目是nodeJS配置本地https服务,不用下载源码不用付费,直接使用Git的openssh功能(亲测有效)

背景 学习网易云音乐小程序开发&#xff0c;用了老师的node JS做后端服务器&#xff0c;上线小程序体验版必须要https接口。 接下来就是配置NodeJs服务https踩的坑跟发现的惊喜。 配置https 下载与配置 密钥生成 1 运行命令 &#xff1a; openssl genrsa -out privatekey.p…

BST有缺陷--红黑树(RBT)应运而生

1.首先介绍一下什么是BST&#xff08;二叉查找树&#xff09; 若其左子树非空&#xff0c;则左子树上所有节点的值都小于根节点的值若其右子树非空&#xff0c;则右子树上所有节点的值都大于根节点的值其左右子树都是一棵二叉查找树二叉排序树通过中序遍历可以得到递增序列 如下…

技能树-网络爬虫-selenium

文章目录 前言一、selenium二、selenium 测试用例总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下《技能树-网络爬虫-selenium》。 一、selenium Selenium是web自动化测试工具集&#xff0c;爬虫可以利用其实现对页面动态资源的采集&#xff0c;对于…

一位老程序员的忠告:别想着靠技术生存一辈子

注&#xff1a;本文系转载。 笔者目前是自己单干&#xff0c;但此前有多年在从事软件开发工作&#xff0c;回头想想自己&#xff0c;特别想对那些初学JAVA/DOT、NET技术的朋友说点心里话&#xff0c;希望我们的体会多少能给你们一些启发。 一、 在一个地方工作8小时就是“穷”…

Python多线程与多进程教程:全面解析、代码案例与优化技巧

文章目录 引言多线程多线程概述案例1&#xff1a;使用多线程实现并发下载文件案例2&#xff1a;使用多线程处理CPU密集型任务 使用threading模块案例1&#xff1a;自定义线程类并启动线程案例2&#xff1a;使用锁保护共享资源 线程同步与互斥案例&#xff1a;使用锁实现线程安全…

css用法总结

1. 块级元素合并时边框重叠问题的解决方案 设置边框2px 红色 如果不做处理&#xff0c;仅仅添加边框则会是这个样子 设置处理后的样式 代码展示 2. 拥有边框的div , hover时的展示效果 代码展示 3. img 和 文字环绕展示 代码展示 设置左浮动即可 4. text-align: center; 可…

Linux——Samba文件共享服务

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…

Go语言基础-基础语法

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 &#x1f49e;从这个专栏里面可以迅速获得Go的知识 本文主要是根据今天所学&#xff08;链接放在了最后&#xff09;总结记录的…

please specify ‘programme‘ in launch.json

故障现象&#xff1a; 在windows下点击F5&#xff0c;以运行vscode代码&#xff0c;在屏幕右下角出现这个错误提醒&#xff1b; 故障原因&#xff1a; 在配置文件&#xff08;settings.json或者launch.json&#xff09;中&#xff0c;缺少“program”这个参数配置&#xff1b…