二维码识别
任务一
在项目week1中建立python脚本实现二维码识别,要求打印出二维码文本,并输出二维码四个角像素坐标
函数格式如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15def decode_qr(img_path):
"""
输入:图片路径
输出:
{
'content': 二维码文本,
'points': [[x1,y1],...,[x4,y4]] # 四个角点像素坐标
}
"""
代码
1 |
|
代码思路
先使用imread()函数读取指定路径的图片数据,如果无法读取,返回错误提示;若正常读取,使用detectAndDecode()方法检测和解码二维码,将返回值分别赋值给content,和points变量,然后将points变量转化为pyhton自带的列表形式,最后返回内容(保存在content变量中)和角点坐标(保存在points变量中)。
基础知识
imread()函数
1 |
|
参数:
filepath
:读入读取图片的路径(绝对/相对)flags
:标志位,可输入参数如下cv2.IMREAD_COLOR
:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代cv2.IMREAD_GRAYSCALE
:读入灰度图片,可用0作为实参替代cv2.IMREAD_UNCHANGED
:顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代
alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明
路径注意点
filename
:要读取的图像的完整路径,注意文件名中不能有中文。
比如当读取文件为中文名时,输入image = cv2.imread("示范.png")
报错无法找到can't open/read file: check file path/integrity
imread()的返回值
imread()函数返回的是一个numpy.ndarray类型的数据,一般是一个三维数组
imread读取图片的颜色顺序是B->G->R
所以image[:,:,1] image[:,:,2] image[:,:,3] 这3个数组中分别存放图片各像素点BGR的值
imshow()
使用imshow()函数时,必须将输入值补全,特别是显示窗口的名称,否则无法显示,比如输入以下代码:
1 |
|
显示错误
加上窗口名称后
1 |
|
正常运行,但界面一闪而过
图片显示后一闪而过的原因是缺少让程序暂停的等待操作。cv2.imshow
函数只是负责显示图像窗口,但如果没有后续的等待指令,窗口会立即关闭。
增加语句cv2.waitKey(0)
1 |
|
图片正常保持显示
代码解释
根据题目要求,函数decode_qr()的输入值img_path
是二维码的路径
1 |
|
通过cv2.imread() 函数将img_path
路径的图片文件加载为 NumPy 数组,数组中的每个元素分别表示像素值的BGR数值
1 |
|
检查图片是否成功加载,当imread返回值为空(None)时,说明图片路径无效或文件损坏,抛出异常提示用户
1 |
|
cv2.QRCodeDetector()
是 OpenCV 提供的用于检测和解码二维码的类,创建一个了一个 QR 码检测器实例qr_detector
1 |
|
利用创建的实例qr_detector
的detectAndDecode()
方法检测图片转化的数组image
中的二维码并解码其内容。detectAndDecode()
方法会返回三个值:
- content:二维码包含的信息(字符串格式)。
- points:二维码的四个角点坐标(NumPy 数组)。
- _:二维码的二进制数据(未使用)。
1 |
|
当没有检测到二维码时,detectAndDecode()
方法会返回的第一个值content
为空字符串,函数返回 None。
1 |
|
detectAndDecode()
方法返回的二维码在图像中的位置信息保存在points
中,points[0]
中包含多个点的坐标,形式如points[0] = [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
tolist()
是NumPy数组的一个方法,用于将数组转换为Python原生的列表格式。
这一句也可以删去。
1 |
|
按要求返回值。
运行结果
第一张二维码
第二张二维码