一、基本概念
微信开源了其二维码的解码功能,并贡献给 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)]//4public 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