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

news/2025/2/19 8:15:45/

一、基本概念

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

 


http://www.ppmy.cn/news/548116.html

相关文章

AMBA AHB的burst termination

前言 在AMBA AHB协议中&#xff0c;AHB master可以用burst传输连续取多笔数据。AHB定义了4、8和16拍的burst传输、未定义长度的burst传输和单次传输。Burst传输中支持incrementing和wrapping。 Incrementing burst用于访问顺序的memory地址&#xff0c;burst中每个拍的地址都…

java面试中的问题

计算机网络&#xff1a; tcp/udp的区别 三次握手四次挥手 http和https的区别&#xff1a; http是明文的&#xff0c;httpshttpssl加密 get和post的区别&#xff1a; get&#xff1a;参数放到url里面&#xff0c;所以请求会被浏览器缓存&#xff0c;url长度受限&#xff0c; pos…

年度巅峰对决 GOW携虚幻3决战Crysis

《年度巅峰对决 GOW携虚幻3决战Crysis》分页索引 第1页&#xff1a;前言第2页&#xff1a;虚幻引擎3技术纵览第3页&#xff1a;无处不在的Normal Mapping跟virtual displacement mapping第4页&#xff1a;Ageia PhysX驱动下的物理引擎第5页&#xff1a;先进完善的网络功能第6页…

自学GRE要准备些什么

首先&#xff0c;要收集资料&#xff0c;推荐你去寄托网&#xff08;bbs.gter.net&#xff09;去下资料&#xff0c;东西很全的&#xff0c;我复习时基本上都靠它了。红宝书必不可少&#xff0c;单词就是GRE的灵魂&#xff0c;把它搞定基本上就成功了一大半。之后就是做真题&am…

装 A 卡经常死机的原因是 ATI Powerplay自动节能技术?

我禁用 s205 驱动自带的 powerplay 后的确是稳定了不少. 还有其他网友也反映了类似的情况.另外还要在 "Lenovo电源管理" 中的 "cpu模式" 设置为固定值,这样会更好一些.不过某些情况,比如我操作 vs2008 的过程中仍然会不时重启. 我禁用了虚拟内存,好象这样也…

普通显示器玩立体游戏|红蓝立体游戏|iZ3D设置办法

首先&#xff0c;因为立体效果无法用言语表达&#xff0c;所以下面的一张红蓝立体测试图片必须用红蓝立体眼镜才可观察出立体效果。纸质镜架塑料片镜片的几块钱&#xff0c;树脂镜片的眼睛8-10块吧。【如果是看立体电影&#xff0c;建议买一副树脂镜片的红蓝眼镜、1副纸质的红绿…

雅思托福GRE区别

2019独角兽企业重金招聘Python工程师标准>>> IELTS IELTS雅思是International English Language Testing System (国际英语语言测试制度)的简称。 雅思是去英联邦国家留学的英语水平测试。 雅思可用于出国留学或移民。留学:英国、澳大利亚、加拿大、美国(至少40个美…