目录

1 二维码(QRCode)扫描

2 结果

3 参考


在这篇文章中,我们将看到如何使用OpenCV扫描二维码。您将需要OpenCV3.4.4或4.0.0及更高版本来运行代码。

1 二维码(QRCode)扫描

在OpenCV中扫描二维码很简单。我们首先读取图像。然后,我们实例化QRCodeDetector对象并使用detectAndDecode方法来查找QR码的数据和位置。最后,我们进行结果显示。

具体代码如下:

C++:

// QRCode_scanner.cpp

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; /**
* @brief 用于显示检测到的QR码周围的框
*
* @param im
* @param bbox
*/
void display(Mat &im, Mat &bbox)
{
int n = bbox.rows;
for (int i = 0; i < n; i++)
{
line(im, Point2i(bbox.at<float>(i, 0), bbox.at<float>(i, 1)),
Point2i(bbox.at<float>((i + 1) % n, 0), bbox.at<float>((i + 1) % n, 1)), Scalar(255, 0, 0), 3);
}
imshow("Result", im);
} int main()
{
// Read image
Mat inputImage = imread("./image/demo.jpg"); //QR检测器
QRCodeDetector qrDecoder = QRCodeDetector::QRCodeDetector(); //二维码边框坐标,提取出来的二维码
Mat bbox, rectifiedImage; //检测二维码
std::string data = qrDecoder.detectAndDecode(inputImage, bbox, rectifiedImage); //获取二维码中的数据链接
if (data.length() > 0)
{
cout << "Decoded Data : " << data << endl;
display(inputImage, bbox);
rectifiedImage.convertTo(rectifiedImage, CV_8UC3);
//展示二维码
imshow("Rectified QRCode", rectifiedImage); waitKey(0);
}
else
{
cout << "QR Code not detected" << endl;
}
return 0;
}

Python:

import cv2
import numpy as np
import time inputImage = cv2.imread("./image/demo.jpg") # Display barcode and QR code location
def display(im, bbox):
n = len(bbox)
for j in range(n):
cv2.line(im, tuple(bbox[j][0]), tuple(bbox[ (j+1) % n][0]), (255,0,0), 3) # Display results
cv2.imshow("Results", im) # Create a qrCodeDetector Object
qrDecoder = cv2.QRCodeDetector() # Detect and decode the qrcode
t = time.time()
data,bbox,rectifiedImage = qrDecoder.detectAndDecode(inputImage)
print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
if len(data)>0:
print("Decoded Data : {}".format(data))
display(inputImage, bbox)
rectifiedImage = np.uint8(rectifiedImage);
cv2.imshow("Rectified QRCode", rectifiedImage);
else:
print("QR Code not detected")
cv2.imshow("Results", inputImage)
cv2.imwrite("output.jpg",inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 结果

二维码定位画框:

命令行输出,也就是提取的二维码链接:

Decoded Data : http://LearnOpenCV.com

所获取的二维码点图:

总体来说OpenCV检测的效果只能作为研究用。所有的代码见:

https://github.com/luohenyueji/OpenCV-Practical-Exercise

实际用还是用ZBar比较好,ZBar还支持条形码的识别,OpenCV只有二维码的识别。

ZBar具体应用见:

http://zbar.sourceforge.net/

https://blog.csdn.net/qq_38712026/article/details/78674665

https://blog.csdn.net/dcrmg/article/details/52132313

3 参考

OpenCV自带二维码识别:

https://www.learnopencv.com/opencv-qr-code-scanner-c-and-python/

OpenCV上使用ZBar进行二维码和条形码识别:

https://www.learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/

[OpenCV实战]11 基于OpenCV的二维码扫描器的更多相关文章

  1. 基于Zxing的二维码的二维码扫描之横屏扫描

    最近项目条码扫描要改为横屏,网上所搜了一下,然后发现我写的需要改动几行代码就可以了,还是很给力的. 如未查看之前的代码,请移步: 基于Zxing的二维码生成和二维码扫描 修改下面写代码就可以实现横屏条 ...

  2. 基于zxing的二维码(网格)扫描

    基于zxing的二维码(网格)扫描 前言:对于二维码扫描我们使用的是开源框架Zxing或者Zbar,这里使用基于zxing的二维码扫描,类似支付宝网格扫描, 二维码原理介绍: 二维码是用某种特定的几何 ...

  3. 用Swift开发二维码扫描器教程

    (原文:Building a QR Code Reader in Swift 作者:Simon Ng 译者:xiaoying )我相信大多数人都知道二维码(QR code)是什么,如果你对这个概念还不 ...

  4. 运行Google 官方zxing二维码扫描器

    首先,要去下载Zxing的源码,由于Zxing 的服务内容比较广,我们先把所有的源码都下载下来,使用的时候根据需要加载. 或者从开源中国下载https://www.oschina.net/questi ...

  5. 基于canvas的二维码邀请函生成插件

    去年是最忙碌的一年,实在没时间写博客了,看着互联网行业中一个又一个人的倒下,奉劝大家,健康要放在首位,保重身体.好了,言归正传,这是17年的第一篇博文,话说这天又是产品同学跑过来问我说:hi,lenn ...

  6. 基于java生成二维码

                                                                                            二维码  二维码的概念 ...

  7. iOS中 基于LBXScan库二维码扫描 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 首先声明这个二维码扫描是借助于zxing. 功能模块都完全封装好了,不过界面合你口味,直接使用就好,如果不合口味,后 ...

  8. 基于Web和二维码的文件传输服务

    在工作中难免需要对外提供一些我们抓取的log或者操作视频之类的资料,但由于工作环境日渐规范和严格,公司的网络环境和客户的网络环境是被独立开来的.这样做的好处不必多说,但同时也给我们工作带来的诸多不便. ...

  9. 基于nginx实现二维码下载安装apk文件

    将apk文件置于nginx目录下 <!--进入nginx安装路径--> /usr/local/nginx <!--新建放apk的目录--> mkdir -p resources ...

随机推荐

  1. Oh My Life~

    作者:HChan 链接:https://zhuanlan.zhihu.com/p/47084162 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Part 1 那年 ...

  2. VM运行centos网络配置(出现错误)详解

    一般按照正常安装流程到这一步的时候可以直接点击网络和主机名,但是我这里并没有连接成功,因此我跳过了这里想着后面再配置 后面通过ping www.baidu.com以及ping 百度的ip地址(如何获得 ...

  3. PHP Phar反序列化学习

    PHP Phar反序列化学习 Phar Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件.它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句. 默认开启版 ...

  4. Hbase之shell基本操作

    一.系统命令 启动hbase Shell ./bin/hbase shell 获取帮助 help 查询服务器状态 status 查询hbase版本 version 查询表 list 获取表描述 des ...

  5. 检测 MySQL 服务是否存活 shell脚本

    #!/bin/bash # 检测 MySQL 服务是否存活 # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码 # 这些信息需要根据实 ...

  6. mysql安装教程-window操作系统

    1.下载安装包(官网下载) 直达链接:https://dev.mysql.com/downloads/mysql/ 下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯,放C盘多 ...

  7. 简单将Springboot项目部署到linux服务器上

    1.使用springboot的jar包方式 直接使用maven工具按照步骤点击就可以直接打包 2.到target目录下找到 jar包 3.将jar包放到linux的任意文件夹下(此项目是之前的kafk ...

  8. .NET API 接口数据传输加密最佳实践

    .NET API 接口数据传输加密最佳实践 我们在做 Api 接口时,相信一定会有接触到要给传输的请求 body 的内容进行加密传输.其目的就是为了防止一些敏感的内容直接被 UI 层查看或篡改. 其实 ...

  9. 九、Django3的ASGI

    九.Django3的ASGI 9.1.Web应用程序和web服务器 Web应用程序(Web)是一种能完成web业务逻辑,能让用户基于web浏览器访问的应用程序,它可以是一个实现http请求和响应功能的 ...

  10. Agda学习笔记1

    目录 Agda学习笔记1 快捷键 refl Natural Number 自然数集合 operations rewrite cong 加法结合律 加法交换律 乘法分配律 比较大小 衍生的一些证明 be ...