本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

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

图7-29 QR二维码各部分的作用

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()表示不输出图像。

为了了解QR二维码定位和解码相关函数的使用方法,在代码清单7-40中给出了利用上述三个函数识别QR二维码的示例程序。程序中将定位和解码分步识别结果和直接识别结果显示在含有QR二维码的图像中,并输出校正和二值化的QR二维码。程序输出结果在图7-30给出,为了能够直观的了解校正和二值化的QR二维码,图7-30中使用的是Image Watch中查看到的校正和二值化的QR二维码图像。

代码清单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;
}

图7-30 mydetectQRcode.cpp程序中二维码识别结果

经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】QR二维码检测相关推荐

  1. AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练)

    AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练) 1.      大家碰到的很多都是二维码识别不出来的情况. 原因:周围环境的光太强或太暗,遮挡了二维码的信息,摄像头识别不到全部的信 ...

  2. OpenCV4.0 快速QR二维码检测测试示例

    点击我爱计算机视觉标星,更快获取CVML新技术 近几年由于微信大力推广移动支付,二维码已经成为手机App的标配,在众多种类的二维码中,QR码是最为流行的. 刚刚发布的OpenCV4.0-Alpha新增 ...

  3. OpenCV C++案例实战三《二维码检测》

    OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...

  4. Android OpenCV(四十):QR二维码检测与识别

    QR二维码 QR码(英语:Quick Response Code:全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明.QR来自英文Quick Response的缩写 ...

  5. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】深度神经网络应用实例

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】分割图像——Grabcut图像分割

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 一次 JVM 调优的笔记
  2. CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面
  3. Maven 插件打包java 后台
  4. 存储过程能用if not exist_C++核心准则T.48:如果不能用概念,用enable_if
  5. 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
  6. java jaxb xml
  7. Spring配置中的bean直接引用其它bean的属性值
  8. 算法应用四:【经典算法】易混淆的图像处理总结
  9. 无代码开发究竟是不是伪需求?
  10. kafka与zookeeper下载安装及kafka常用命令
  11. python实现文件管理系统_Python - 文件管理系统
  12. 使用stack栈集合完成ABC全排列
  13. python雷达图的相似度_python画雷达图
  14. NO32、把数组排成最小的数(很好的一道题)
  15. FPGA + labwindows/CVI 2017 串口通信 电子钟
  16. python递推公式_线性代数求解递推形式数列的通项公式
  17. 关于sqlserver身份登录失败的解决方法
  18. 中国手机企业努力一年,不如苹果一周,后者在5G手机市场完胜
  19. 三个牛人教你怎么高效阅读论文
  20. STM32F103系列之移植uCOS-II

热门文章

  1. 百度研究院再升级,迎来9位世界级科学家
  2. 英伟达发布史上最强GPU,却叫停了自动驾驶车路测
  3. 中国首场AI芯片产业峰会成功举办 GTIC 2018热度空前
  4. AI 一分钟 | 微软推出全新人工智能平台;多名用户反映亚马逊 Echo 智能音箱突然发笑
  5. 观点 | 李开复谈AI创业的“风口”和“泡沫”
  6. BeanUtils 是用 Spring 的还是 Apache 的好?
  7. Redis实现分布式锁的深入探究
  8. 我在 GitHub 上都见过哪些沙雕项目?
  9. 机器学习4个常用超参数调试方法!
  10. 导师:CV学的这么差,你别毕业了