首页 > 其他分享 >36.QR二维码检测

36.QR二维码检测

时间:2023-04-11 17:12:23浏览次数:27  
标签:QR 函数 解码 36 二维码 points 顶点

  二维码被广泛的应用在我们日常生活中,比如微信和支付宝支付、火车票、商品标识等。二维码的出现极大的方便了我们日常的生活,同时也能将信息较为隐蔽的传输。二维码种类多种多样,有QR Code、Data Matrix、Code One等,日常生活中常用的二维码是QR二维码,该二维码样式以及每部分的作用在图7-30给出。二维码定点方向有三个较大的“回”字形区域用于对二维码进行定位,该区域最大的特别之处在于任何一条经过中心的直线其在黑色和白色区域的长度比值都为1:1:3:1:1。二维码中间具有多个较小的“回”字形区域用于二维码的对齐,根据二维码版本和尺寸的不同,对齐区域的数目也不尽相同。

  QR二维码的识别过程大致分成两个过程,首先搜索二维码的位置探测图形,即QR二维码中三个顶点处的“回”字区域,QR二维码位置以四个顶点的坐标形式给出。之后对二维码进行解码,提取其中的信息。QR二维码识别是OpenCV 4新增加的功能,OpenCV 4提供了相关函数直接解码QR二维码读取其中的信息,但是在OpenCV 4之前的版本中对QR二维码的识别需要借助第三方工具,常用的是zbar解码库。

  针对QR二维码识别的两个过程,OpenCV 4提供了多个函数用于实现每个过程,这些函数分别是定位QR二维码的detect()函数、根据定位结果解码二维码的decode()函数以及同时定位和解码的detectAndDecode()函数,接下来将详细介绍这三个函数的函数原型和使用方法。

  定位QR二维码的位置不仅可以用于解码QR二维码,也可以用于视觉定位。在利用QR二维码定位的任务中有时不需要对QR二维码进行解码,而是直接使用四个顶点的坐标,因此只定位不解码QR二维码可以加快系统的运行速度。定位QR二维码函数detect()的函数原型在代码清单7-37中给出。

代码清单7-37 detect()函数原型
bool cv::QRCodeDetector::detect(InputArray  img,
                                OutputArray  points 
                                )
  • img:待检测是否含有QR二维码的灰度图像或者彩色图像。
  • points:包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。

  该函数能够识别图像中是否含有QR二维码,以bool类型的返回值表示是否含有二维码的结果。如果图像中含有二维码,返回值为true,否则返回值为false。函数第一个参数是待检测是否含有QR二维码的图像,图像可以是灰度图像或者彩色图像,图像的尺寸任意。函数第二个参数是包含QR二维码的最小区域四边形的四个顶点坐标,数据类型为vector。

decode()函数能够利用图像中二维码的定位结果对QR二维码进行解码,该函数的函数原型在代码清单7-38中给出。

代码清单7-38 decode()函数原型
std::string cv::QRCodeDetector::decode(InputArray  img,
                                       InputArray  points,
                                       OutputArray  straight_qrcode = noArray() 
                                       )
  • img:含有QR二维码的图像。
  • points:包含QR二维码的最小区域四边形的四个顶点坐标。
  • straight_qrcode:经过校正和二值化的QR二维码。

  该函数能够根据二维码定位的结果信息对二维码进行解码,以string类型的返回值输出解码结果。该函数前两个参数与detect()函数的两个参数含义相同,不过该函数的第二个参数是输入值,数据量不能为空。函数第三个参数是经过校正和二值化的QR二维码,变量类型为Mat,在校正的二维码中每一个有效数据点都以单个像素出现,例如在经过校正和二值化的QR二维码中“回”字形区域中心的黑色区域尺寸为3×3,黑色区域边缘的白色轮廓宽度为1。

有时我们需要识别二维码中的信息,detectAndDecode()函数可以直接一步完成二维码的定位和解码过程,该函数的函数原型在代码清单7-39中给出。

代码清单7-39 detectAndDecode()函数原型
std::string cv::QRCodeDetector::detectAndDecode(InputArray  img,
                                                OutputArray  points = noArray(),
                                                OutputArray  straight_qrcode = noArray() 
                                                )
  • img:含有QR二维码的图像。
  • points:包含QR二维码的最小区域四边形的四个顶点坐标。
  • straight_qrcode:经过校正和二值化的QR二维码。

  该函数能够直接完成对QR二维码四个顶点的定位和识别图像中QR二维码的信息,并以vector类型返回四个顶点的坐标,以string类型的返回值输出QR二维码识别的结果。函数第一个参数是含有QR二维码的灰度图像或者彩色图像。第二个参数是包含QR二维码的最小区域四边形的四个顶点坐标,在此函数中该参数是输出值,如果不需要QR二维码顶点坐标可以在调用函数时缺省该参数或者使用默认参数noArray()表示不输出坐标。函数第三个参数是经过校正和二值化的QR二维码,变量类型为Mat,如果不需要输出该结果可以在调用函数时缺省该参数或者使用默认参数noArray()表示不输出图像。

代码清单7-40 mydetectQRcode.cpp二维码识别
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

int main()
{
  Mat img = imread("qrcode2.png");
  if (img.empty())
  {
    cout << "请确认图像文件名称是否正确" << endl;
    return -1;
  }
  Mat gray, qrcode_bin;
  cvtColor(img, gray, COLOR_BGR2GRAY);
  QRCodeDetector qrcodedetector;
  vector<Point> points;
  string information;
  bool isQRcode;
  isQRcode = qrcodedetector.detect(gray, points);  //识别二维码
  if (isQRcode)
  {
    //解码二维码
    information = qrcodedetector.decode(gray, points, qrcode_bin);
    cout << points << endl;  //输出二维码四个顶点的坐标
  }
  else
  {
    cout << "无法识别二维码,请确认图像时候含有二维码" << endl;
    return -1;
  }
  //绘制二维码的边框
  for (int i = 0; i < points.size(); i++)
  {
    if (i == points.size() - 1)
    {
      line(img, points[i], points[0], Scalar(0, 0, 255), 2, 8);
      break;
    }
    line(img, points[i], points[i + 1], Scalar(0, 0, 255), 2, 8);
  }
  //将解码内容输出到图片上
  putText(img, information.c_str(), Point(20, 30), 0, 1.0, Scalar(0, 0, 255), 2, 8);

  //利用函数直接定位二维码并解码
  string information2;
  vector<Point> points2;
  information2 = qrcodedetector.detectAndDecode(gray, points2);
  cout << points2 << endl;
  putText(img, information2.c_str(), Point(20, 55), 0, 1.0, Scalar(0, 0, 0), 2, 8);

  //输出结果
  imshow("result", img);
  namedWindow("qrcode_bin", WINDOW_NORMAL);
  imshow("qrcode_bin", qrcode_bin);
  waitKey(0);
  return 0;
}

 

标签:QR,函数,解码,36,二维码,points,顶点
From: https://www.cnblogs.com/okmai77xue/p/17306856.html

相关文章

  • 活动预约报名二维码的制作分享
    随着互联网的普及,越来越多的企业和组织开始采用预约报名二维码作为活动或服务的报名渠道。预约报名二维码目前正广泛应用于各种场景,如展会、活动、讲座、课程等。比如将二维码设计在海报上,通过线下或线上的形式发送给意向客户,客户自行扫码便能查看详细的活动介绍、时间及规则等内容......
  • power apps canvas 最新scan 扫描功能 barcode, QR code
    Barcodereader现在全面代替barcode scanner barcodereader现在只能通过powerappsmobileapp或者powerappsWindowsUWPapp来使用。还不能通过浏览器使用      Barcodereader控件支持下面数据类型   barcodereader控件和scanner最大的区......
  • 1363. 形成三的最大倍数
    题目描述给一个整数数组问怎么选数字,可以让能得到的结果最大,同时这个接结果需要是3的倍数?f1分类讨论+贪心基本分析怎么判断能不能被3整除?和%3==0怎么判断该从数组中删掉哪些数字?(1)和%3==1,删最小的余1的数字,不行删俩最小的余2的数字;(2)和%3==2,删最小的余2的数字或者......
  • 3500/92 136180-01 从超声波计数器获取数据
    3500/92136180-01从超声波计数器获取数据当乘客在预先定义的时间之前经过传感器2附近时,计数器会将该动作记录为“上车”事件。如果传感器2没有检测到乘客,那么计数器将保持相同的值。图6a显示了乘客的“上车”事件。当一个人下车时,过程是相似的。在这种情况下,乘客将走到传感器2......
  • Python 小型项目大全 36~40
    三十六、沙漏原文:http://inventwithpython.com/bigbookpython/project36.html这个可视化程序有一个粗糙的物理引擎,模拟沙子通过沙漏的小孔落下。沙子堆积在沙漏的下半部分;然后把沙漏翻过来,重复这个过程。运行示例图36-1显示了运行hourglass.py时的输出。:沙漏程序在落......
  • Qt音视频开发36-超时检测和自动重连的设计
    一、前言如果网络环境正常设备正常,视频监控系统一般都是按照正常运行下去,不会出现什么问题,但是实际情况会很不同,奇奇怪怪七七八八的问题都会出现,就比如网络出了问题都有很多情况(交换机故障、网线故障、带宽故障等),所以监控系统在运行过程中,还得做超时检测,超过规定的时间没有收到数......
  • 6361.对角线上的质数-340
    对角线上的质数给你一个下标从0开始的二维整数数组nums。返回位于nums至少一条对角线上的最大质数。如果任一对角线上均不存在质数,返回0。注意:如果某个整数大于1,且不存在除1和自身之外的正整数因子,则认为该整数是一个质数。如果存在整数i,使得 nums[i][i]......
  • 6360.等值距离和-340
    等值距离和给你一个下标从0开始的整数数组nums。现有一个长度等于nums.length的数组arr。对于满足nums[j]==nums[i]且j!=i的所有j,arr[i]等于所有|i-j|之和。如果不存在这样的j,则令arr[i]等于0。返回数组arr。示例1:输入:nums=[1,3,1,1,2]输......
  • 第136篇:Three.js基础入门动画API:setInterval 与 requestAnimationFrame的区别
    好家伙,书接上文 functionanimate(){//请求-动画-框架requestAnimationFrame(animate);//改变正方体在场景中的位置,让正方体动起来cube.rotation.x+=0.01;cube.rotation.y+=0.01;renderer.render(......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    题目链接:剑指Offer36.二叉搜索树与双向链表方法一:回溯解题思路代码classSolution{private:intmx=INT_MIN,mi=INT_MAX;Node*start=NULL,*end=NULL;public:voidLrotate(Node*root,Node*last_root){//针对左子树,左旋if(!ro......