首页 > 编程语言 >c# 基于wechat_qrcode opencv插件,网络二维码图片批量识别(一)

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

时间:2023-06-24 17:04:42浏览次数:45  
标签:插件 return string c# opencv 二维码 result 识别 public

 

一、基本概念

   微信开源了其二维码的解码功能,并贡献给 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=

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

四、成品

功能包括:

●基于微信wechat_qrcode开源opencv微信二维码扫码识别插件;

●本地二维码图片识别;

●网络二维码图片识别;

●网络二维码图片识别接口;

●支持高并发、多线程识别。返回识别后的字符串;

●无需安装即可使用;

下载地址:

http://helpnow.top/qr

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




标签:插件,return,string,c#,opencv,二维码,result,识别,public
From: https://blog.51cto.com/u_16113078/6541187

相关文章

  • 微服务 – Spring Cloud – Gateway
    微服务–SpringCloud–GatewayApi网关(ApiGateway)微服务可能分布在不同的主机上,这样有许多缺点:前端需要硬编码调用不同地址的微服务很麻烦;存在跨域访问的问题;微服务地址直接暴露是不安全的。还有所以需要为前端提供一个统一的访问入口。Gateway就是用于解决以上问题的框......
  • Kubernetes CNI 网络模型及常见开源组件
    随着容器技术在企业生产系统中的逐步落地,用户对容器云的网络特性要求也越来越高。跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址、一个容器多个IP地址、多个子网隔离、ACL控制策略、与SDN集成等。目前主流的容器网络模型是CoreOS公司推出的Contai......
  • CF771C Bear and Tree Jumps
    CF771CBearandTreeJumpslink赛时脑子抽了没想出来,其实思路已经沾边了,但是……唉,还是太菜了qwq。题意:给你一颗有\(n\)个点的树,和每次能走的最大步数\(K\),求所有点对相互到达的最小步数之和。思路:首先第一步转化很简单:设点\(u,v\)在树上的距离为\(d\),则\(u,v\)......
  • Pickle反序列化漏洞学习
    Pickle反序列化漏洞模块pickle实现了对一个Python对象结构的二进制序列化和反序列化。"pickling"是将Python对象及其所拥有的层次结构转化为一个字节流的过程,而"unpickling"是相反的操作,会将(来自一个binaryfile或者bytes-likeobject的)字节流转化回一个对象层次......
  • AGC021E Ball Eat Chameleons 题解
    本文网址:https://www.cnblogs.com/zsc985246/p/17501300.html,转载请注明出处。传送门AGC021EBallEatChameleons题目翻译有\(n\)只变色龙,一开始都是蓝色。你会依次扔出\(k\)个球,每次扔出都要指定一只变色龙吃掉这个球。扔出的球可以是红色或蓝色。变色龙从蓝色变成红......
  • 第六节:基于.Net的OpenAI包测试使用ChatGPT的各种Api
    一.前置1. 说明 支持多种语言,详见:https://platform.openai.com/docs/libraries/community-libraries 以.Net为例,主要有三个包  OpenAI           https://github.com/OkGoDoIt/OpenAI-API-dotnet  Betalgo.OpenAI     https://g......
  • 【Debian】更换阿里源出现的Certificate问题解决方法
    系统版本Debian11源配置debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://mirrors.aliyun.com/debian-security/bullseye-securitymaindeb-src......
  • springcloud项目启动后立即停止
    刚学完springcloud,只看了一遍课没有动手实践,现在第一次自己动手操作的时候不知道该选哪些依赖该怎么配置。依赖全选上后因为各自配置问题运行不起来,只能先从最简单的开始慢慢加依赖。这次只选了nacos和feign,成功运行,项目也没有报错,但是运行后项目立马停止。 百度了一下原因......
  • 8. IOC & DI注解开发管理第三方bean
    ‍1.注解开发管理第三方bean‍在上述环境中完成对​Druid​数据源的管理,具体的实现步骤为:步骤1:导入对应的jar包<dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid</artifactId>  <version>1.1.16</version></dependency>步骤2:在......
  • springboot使用Websocket写一个聊天室
     1<!--websocket依赖-->2<dependency>3<groupId>org.springframework.boot</groupId>4<artifactId>spring-boot-starter-websocket</artifactId>5</dependency>目录 ......