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

一、基本概念

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

猜你喜欢

转载自blog.csdn.net/byc6352/article/details/131360357