版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记
学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客
学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客
12.2 WeChatQRCode
WeChatQRCode类是一个用于识别和生成微信二维码的类,它提供了一组方法来创建、识别和解码二维码图像。它是腾讯团队贡献的模块。
一、构造函数载入模型
WeChatQRCode qrcd1 = new WeChatQRCode(
modpath + "detect.prototxt",
modpath + "detect.caffemodel",
modpath + "sr.prototxt",
modpath + "sr.caffemodel");
需要载入的模型包括:detect.prototxt、detect.caffemodel、sr.prototxt、sr.caffemodel,通常安装EmguCV后就有。如果没有,可以从https://github.com/WeChatCV/opencv_3rdparty下载。
二、使用DetectAndDecode方法获得二维码信息,该方法常用的一个重载:
public string[] DetectAndDecode ( IinputArray img, IoutputArrayOfArrays points);
参数说明:
- Img:包含二维码的输入图像。
- points:这是一个VectorOfMat对象。返回的每个二维码所在矩形框四角坐标保存在一个Mat中。每个Mat有8个double数据,对应4个点的坐标,表示该二维码所在的矩形框。
返回包含多个二维码解码后的信息(字符串数组)。
具体代码如下:
【代码位置:frmChapter12】Button3_Click、PointFToPoint
//二维码识别
//使用微信提供的WeChatQRCode
private void Button3_Click(object sender, EventArgs e)
{
Mat m = new Mat("c:\\learnEmgucv\\qrcode3.png", ImreadModes.AnyColor);
ImageBox1.Image = m;
string modpath = "C:\\learnEmgucv\\wechat_qrcode\\";
//必须的几个模块,可以在如下地址下载
//https://github.com/WeChatCV/opencv_3rdparty
WeChatQRCode qrcd1 = new WeChatQRCode(
modpath + "detect.prototxt",
modpath + "detect.caffemodel",
modpath + "sr.prototxt",
modpath + "sr.caffemodel");
string[] infos;
//返回有几个二维码,每个二维码所在矩形框四角坐标保存在一个Mat中
//每个mat有8个double数据,对应4个点的坐标,表示该二维码所在的矩形框
VectorOfMat vm = new VectorOfMat();
infos = qrcd1.DetectAndDecode(m, vm);
//返回解码后的结果
for (int i = 0; i < infos.Length; i++)
Console.WriteLine(infos[i]);
VectorOfPointF[] qrp = new VectorOfPointF[vm.Size];
for (int i = 0; i < vm.Size; i++)
{
PointF[] p=new PointF[4];
vm[i].CopyTo(p);
qrp[i] = new VectorOfPointF();
qrp[i].Push(p);
}
//标记二维码位置
Mat m1 = new Mat();
m1 = m.Clone();
for (int i = 0; i < qrp.Length; i++)
{
CvInvoke.Line(m1, PointFToPoint(qrp[i][0]), PointFToPoint(qrp[i][1]), new MCvScalar(0, 0, 255), 2);
CvInvoke.Line(m1, PointFToPoint(qrp[i][1]), PointFToPoint(qrp[i][2]), new MCvScalar(0, 0, 255), 2);
CvInvoke.Line(m1, PointFToPoint(qrp[i][2]), PointFToPoint(qrp[i][3]), new MCvScalar(0, 0, 255), 2);
CvInvoke.Line(m1, PointFToPoint(qrp[i][3]), PointFToPoint(qrp[i][0]), new MCvScalar(0, 0, 255), 2);
}
CvInvoke.Imshow("qrcode", m1);
}
//将PointF转Point方法
private Point PointFToPoint(PointF pf)
{
return new Point((int)pf.X, (int)pf.Y);
}
输出结果如下图所示:
图12-3 使用WeChatQRCode获得二维码信息