opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成

废话不多说,直接上代码

cpp 复制代码
# 生成二维码
import qrcode

# 二维码包含的示例数据
data = "B0018"
# 生成的二维码图片名称
filename = "qrcode.png"
# 生成二维码
img = qrcode.make(data)
# 保存成图片输出
img.save(filename)

img.show()

运行效果:

会在当前目前生成一张图片

对生成的二维码识别

opencv从4代之后推出了二维码识别接口.调用方法是这样的.代码如下:

cpp 复制代码
import cv2

img = cv2.imread('qrcode.png')
qrcode = cv2.QRCodeDetector()
result, points, code = qrcode.detectAndDecode(img)

print(result)

运行结果:

cpp 复制代码
B0018

返回值有三个,

  • 第一个result就是解码后的内容,例如我这个二维码的结果是"B0018",当然也可以是个纯数字.

  • 第二个points是二维码轮廓的四个角,从左上角顺时针转的.

  • 第三个code是二维码的原始排列,也就是每个点是0还是255的一个矩阵.白色是255,黑色是0.调用起来十分方便,而且如果不需要解码,只是想定位的话可以调用detect函数,返回结果就只有四个角点了.

如果是一个大图中的一个二维码识别呢?比如下面的这个图

如果继续使用上面的识别二维码是识别不出来的。

下面我们看下二维码的原理及定位原理

二维码的结构与基本原理

标准的二维码结构如下:

特别要关注的是图中三个黑色正方形区域,它们就是用来定位一个二维码的最重要的三个区域,我们二维码扫描与检测首先要做的就是要发现这三个区域,如果找到这个三个区域,我们就成功的发现一个二维码了,就可以对它定位与识别了。

二维码其它各个部分的说明如下:

三个角上的正方形区域从左到右,从上到下黑白比例为1:1:3:1:1。

不管角度如何变化,这个是最显著的特征,通过这个特征我们就可以实现二维码扫描检测与定位。

除了上面的qrcode 包可以识别二维码外,还有pyzbar 包 也可以进行二维码的识别。比对下pyzbar 比qrcode 包的效率 更高。下面的代码

cpp 复制代码
import cv2
import numpy as np
import time
import pyzbar.pyzbar as pyzbar

# 显示条码和二维码位置
def display(im, decodedObjects):
    # 遍历所有已解码的对象
    for decodedObject in decodedObjects:
        points = decodedObject.polygon

        # 如果点不形成四边形,请找到凸包
        if len(points) > 4:
            hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))
            hull = list(map(tuple, np.squeeze(hull)))
        else:
            hull = points;
        # 凸包中的点数
        n = len(hull)
        # 绘制凸包
        for j in range(0, n):
            cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)
# 创建一个 qrCodeDetector 对象
qrDecoder = cv2.QRCodeDetector()

# 检测和解码二维码
t = time.time()
inputImage = cv2.imread("66.jpg")

decodedObjects = pyzbar.decode(inputImage)
if len(decodedObjects):
    zbarData = decodedObjects[0].data
else:
    zbarData = ''


if zbarData:
    cv2.putText(inputImage, "result : {}".format(zbarData.decode()), (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1,
                (0, 255, 0), 2, cv2.LINE_AA)
else:
    cv2.putText(inputImage, "ZBAR : QR Code NOT Detected", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,
                cv2.LINE_AA)

display(inputImage, decodedObjects)

print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
cv2.imshow("Result", inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

从结果中可以看出可以定位到二维码的位置并将 识别的结果显示在左上角。

相关推荐
饼干哥哥2 分钟前
重生之我是导演:爆改成「牛来版」黑客帝国?附3D预演台保姆级教程!
人工智能·后端·深度学习
Bruce_Liuxiaowei18 分钟前
自动化渗透测试——用AI构建自动化渗透测试流程
运维·人工智能·自动化
AI导出鸭21 分钟前
怎么让Claude做表格?AI导出鸭苹果版将Claude输出的Markdown表格或结构化列表智能解析为二维数据,一键导出Excel/Word标准表格。
人工智能·chatgpt·word·excel·ai导出鸭
ACP广源盛1392462567322 分钟前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 大模型私有化部署中 MST 多屏转换芯片 GSV2231 硬件价值与应用场景
大数据·数据库·人工智能·嵌入式硬件
夏雪coding24 分钟前
openpyxl 对账实战:金额浮点、前导零丢失、20 位单号科学计数法
人工智能·后端
网易云信30 分钟前
7 天,52 个 AI 员工“上岗”了|帝王蟹 AI 实战训练营首期收官
人工智能·线下活动
满怀冰雪31 分钟前
21-图像分类实战:从 MNIST 到 CIFAR-10
人工智能·python·深度学习·分类·数据挖掘·paddlepaddle
RobinDevNotes1 小时前
K8s+DeepSpeed+vLLM打通大模型训练到上线全链路
人工智能
盖伦发发1 小时前
RAG 能跑≠能用:用 EDD 把 Eval 做成基础设施 (附源码)
人工智能·后端·python·功能测试
宋哥转AI1 小时前
深入理解 AI Agent · MEMORY #03:从设计到落地
人工智能·agent·ai编程