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