前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货 | 基于OpenCV Python实现二维码检测与识别

干货 | 基于OpenCV Python实现二维码检测与识别

作者头像
OpenCV学堂
发布2018-12-19 10:41:20
12.5K4
发布2018-12-19 10:41:20
举报
二维码结构与检测

标准的二维码结构如下:

特别要关注的是图中三个黑色正方形区域,它们就是用来定位一个二维码的最重要的三个区域,我们二维码扫描不检测首先要做的就是要发现这三个区域,如果找到这个三个区域,我们就成功的检测到一个二维码了,就可以对它定位与识别了。三个角上的正方形区域从左到右,从上到下黑白比例为1:1:3:1:1。不管角度如何变化,这个是最显著的特征,通过这个特征我们就可以实现二维码扫描检测与定位。

二维码生成

Python语言实现二维码生成其实十分简单,有个纯Python的二维码生成包, 地址与python安装执行命令如下:

https://pypi.org/project/qrcode/ pip install qrcode

然后执行如下代码即可实现二维码的生成, 代码演示如下:

代码语言:javascript
复制
image = qrcode.make('hello, qrcode')
image.save('test.png')

二维码解析

使用zbar进行二维码解析,但是标准的zbar不支持python3,这个比较坑,还好有个大神在zbar的基础上包装了一下,做了pyzbar的开发包,支持python2与python3,非常的好用。安装非常容易,windows下一条命令搞定,Linux与Mac OS下面要先安装zbar然后再执行此命令即可。

pip install pyzbar

解析调用接口支持PIL / Pillow images, OpenCV / numpy ndarrays, and raw bytes等各种格式,可以看出来跟OpenCV可以直接的无缝对接,基本上OpenCV读出来的图像,直接可以给它使用,演示如下:

可以看出解析结果分为四个部分,分别为:

Data – 表示二维码内容 Type表示类型,可以是二维码或者各种条码 Rect表示二维码区域外接矩形 Polygon表示二维码区域的多边形

外接矩形与多边形状表示如下:

其中蓝色矩形表示外接矩形,粉色表示多边形四点坐标。

二维码检测与解析演示

其中QRcodeDetector是我自己实现的基于二值图像轮廓分析实现的二维码检测类。支持各种纠偏,倾斜,放缩二维码检测,同时对检测到的二维码区域会截取ROI区域然后送到zbar进行二维码解析,输出二维码解析data内容。 导入的包与初始化代码如下

代码语言:javascript
复制
import qrcode
from pyzbar.pyzbar import decode
from qrcode_demo.qrcode_detector import QRcodeDetector
import cv2 as cv
import numpy as np

qr_detector = QRcodeDetector()
image = qrcode.make('hello, qrcode')
image.save('test.png')
result = decode(cv.imread('test.png'))
print(result[0][3])

静态图像二维码检测与解析

代码语言:javascript
复制
def image_detect():
    src = cv.imread("D:/images/wechat_id.jpg")
    result, code_image = qr_detector.detect(src)
    text_content = decode(code_image)
    if text_content is not None:
        print("content : %s"% text_content[0][0])
        cv.imshow("input", src)

实时视频二维码检测与解析

代码语言:javascript
复制
def video_detect():
    capture = cv.VideoCapture(0)
    height = capture.get(cv.CAP_PROP_FRAME_HEIGHT)
    width = capture.get(cv.CAP_PROP_FRAME_WIDTH)
    out = cv.VideoWriter("D:/qrcode_demo.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,
                         (np.int(width), np.int(height)), True)
    while True:
        ret, frame = capture.read()
        if ret is True:
            frame = cv.flip(frame, 1)
            cv.imshow("frame", frame)
            result, code_image = qr_detector.detect(frame)
            if code_image is not None:
                text = decode(code_image)
                if len(text) > 0:
                    cv.putText(result, text[0][0].decode("utf-8"), (20, 100), cv.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 2, 8)
                    cv.imwrite("D:/result.png", result)
                    print(text[0][0].decode("utf-8"))
            out.write(result)
            cv.imshow("result", result)

            c = cv.waitKey(5)
            if c == 27:
                break
        else:
            break
    cv.waitKey(0)
    cv.destroyAllWindows()

效果演示

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二维码生成
  • 二维码解析
  • 二维码检测与解析演示
  • 效果演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档