您的当前位置:首页正文

EmguCV学习笔记 C# 12.1 二维码解析

2024-11-07 来源:个人技术集锦

  版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:

教程C#版本请访问:

笔者的博客网址:https:///uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:

学习VB.Net知识,请移步: 

 学习C#知识,请移步:

二维码解析

QRCodeDetector类是Emgu CV库中用于检测和解码二维码的类。

常用方法:

1、Detect方法:检测图像中的QR二维码

public bool Detect(

           IInputArray input,

           IOutputArray points

)

参数说明:

该方法执行成功,将返回二维码四个顶点坐标。

【代码位置:frmChapter12】Button1_Click

        //二维码检测

        private void Button1_Click(object sender, EventArgs e)

        {

            QRCodeDetector qr = new QRCodeDetector();

            //需要测试的图像文件

            Mat m = new Mat("C:\\learnEmgucv\\qrcode1.png", ImreadModes.Color);

            VectorOfPoint vp = new VectorOfPoint();

            //返回二维码四个顶点坐标

            if (qr.Detect(m, vp) == false)

                return;

            //或者:

            //Mat p = new Mat();

            //if (qr.Detect(m, p) == false)

            //    return;

            CvInvoke.Line(m, vp[0], vp[1], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(m, vp[1], vp[2], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(m, vp[2], vp[3], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(m, vp[3], vp[0], new MCvScalar(255, 0, 0), 2);

            ImageBox1.Image = m;

        }

输出结果如下图所示:

 

图12-1 获得二维码坐标位置

2、Decode方法:用于解码获得的QR二维码的内容。

public string Decode(

                    IInputArray image,

                    IInputArray points,

                    IOutputArray straightQrcode = null

)

参数说明:

  1. Image:包含二维码的输入图像。
  2. points:存储QR二维码位置信息。
  3. straightQrcode:经过校正后的二维码图像。

该法方法执行成功,将返回二维码的文字内容。

【代码位置:frmChapter12】Button2_Click

       //二维码识别

        private void Button2_Click(object sender, EventArgs e)

        {

            QRCodeDetector qr = new QRCodeDetector();

            //需要测试的图像文件

            Mat m = new Mat("C:\\learnEmgucv\\qrcode2.png", ImreadModes.Color);

            VectorOfPoint vp = new VectorOfPoint();

            //返回二维码四个顶点坐标

            if (qr.Detect(m, vp) == false)

                return;

            Mat mout1 = m.Clone();

            CvInvoke.Line(mout1, vp[0], vp[1], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(mout1, vp[1], vp[2], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(mout1, vp[2], vp[3], new MCvScalar(255, 0, 0), 2);

            CvInvoke.Line(mout1, vp[3], vp[0], new MCvScalar(255, 0, 0), 2);

            ImageBox1.Image = mout1;

            string strout;

            Mat mout2 = new Mat();

            strout = qr.Decode(m, vp, mout2);

            ImageBox2.Image = mout2;

            MessageBox.Show(strout);

        }

输出结果如下图所示:

图12-2 获得二维码信息

QRCodeDetector类也提供了同时对多个二维码检测和解码的方法,但是经过测试,效果不好。可以使用WeChatQRCode类来代替(请参看12.2节【WeChatQRCode】)。

显示全文