文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-08-30 15:28

关注

1.二维码的生成

废话不多说,直接上代码

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

运行效果:

会在当前目前生成一张图片
在这里插入图片描述

对生成的二维码识别

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

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

运行结果:

B0018

返回值有三个,

如果是一个大图中的一个二维码识别呢?比如下面的这个图
在这里插入图片描述

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

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

二维码的结构与基本原理

标准的二维码结构如下:

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

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

在这里插入图片描述
三个角上的正方形区域从左到右,从上到下黑白比例为1:1:3:1:1。

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

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

import cv2import numpy as npimport timeimport 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].dataelse:    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()

运行效果:

在这里插入图片描述

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

来源地址:https://blog.csdn.net/hai411741962/article/details/132496222

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯