1.实验准备

1.1 实验目的

       使用python识别打开摄像头,识别摄像头图片中是否存在粤康码,若识别到粤康码将判断该粤康码是绿码或是黄码还是红码。


1.2 硬件准备与软件运行环境搭建

  • 硬件
  • 笔记本电脑(自带摄像头)一台
  • USB摄像头一个

USB摄像头识别粤康码并判断是否是绿码_ide

  • 编程语言
  • Python
  • python第三方包
  • opencv-python
  • 摄像头的开启、照片读取
  • pyzbar
  • 二维码、条形码识别、解析

2.实验设计

2.1基本流程

  • 开启摄像头,循环读取图片并在窗口显示
  • 若未检测到二维码,不作响应
  • 若检测到图片中存在二维码,尝试读取其包含的信息
  • 判断该二维码是否是“粤省事”中的粤康码
  • 扫描“粤康码”会得到一个字典信息,其键“c”包含了该粤康码是何种颜色的码的信息(G/Y/R),如下图

USB摄像头识别粤康码并判断是否是绿码_ide_02

  • 判断粤康码是绿码/黄码/红码,打印检测的结果


2.1实验源码

from pyzbar.pyzbar import decode
import cv2
import json


def image_Yuekang_code_recognition(imgObj):
''' :param imgObj: 图像对象,如表示图像的矩阵
:return 识别结果res
'''
res = None
# 读取、解析二维码图片
decocdeQR = decode(imgObj)
# 若图片中不存在二维码/条形码,解析失败,返回一个空列表
if isinstance(decocdeQR,list) and len(decocdeQR) > 0:
# 获得字符串信息
data_str = decocdeQR[0].data.decode(encoding = 'utf-8')
# 二维码信息字典
if data_str.startswith('{') and data_str.endswith('}'):
info_dict = json.loads(data_str)
else:
return '非粤康码'
# print(info_dict)
# 查看是绿/黄/红码
if isinstance(info_dict,dict) and info_dict.get('c') is not None:
if info_dict['c'] == 'G':
res = '绿码'
elif info_dict['c'] == 'Y':
res = '黄码'
elif info_dict['c'] == 'R':
res = '红码'
else:
res = '非粤康码'
# 若返回None则表明未检测到二维码
return res


def camera_identification(source=0):
'''
:param source:7
0 : 默认为笔记本上的摄像头(如果有的话) / USB摄像头 webcam
1 : USB摄像头2
2 :USB摄像头3 以此类推
-1:代表最新插入的USB设备
:return: None
'''
# 摄像头对象
camera = cv2.VideoCapture(source)
print('program start!')
while True:
# 摄像头尝试读取图片
grabbed, frame = camera.read()
# 读取失败,跳过
if not grabbed:
continue
cv2.imshow("YuekangCode recognition", frame)
res = image_Yuekang_code_recognition(frame)
if res is not None:
print(res)
# cv2.waitKey(k)在时间k(单位ms)内,等待用户按键触发(如退出循环体),若没有触发事件,则跳出等待继续执行循环体
if cv2.waitKey(1) & 0xFF == ord('q'):
print('program over!')
break
camera.release()
cv2.destroyAllWindows()


camera_identification(0)

2.3实验效果

    测试所用图片数据均来源规范,且均已屏蔽个人隐私信息,实验效果如下:

USB摄像头识别粤康码并判断是否是绿码_ide_03

3.实验小结

        二维码/条形码的应用在实际生产生活中发挥着重要作用,本实验以使用python工具识别粤康码为例,了解和熟悉摄像头识别二维码并提取其关键信息。

对摄像头来说,其能捕获的图片的像素的大小很重要,这决定了用于后续进行处理的图片的清晰度,本实验使用的USB摄像头的像素级别低,效果不理想,与PC端自带的摄像头(像素级别较高)取得的效果相差较大,2.3中的实验效果是使用PC端自带的摄像头带来的。在使用USB摄像头、相同的二维码进行测试时,不但检测速度慢,且检测结果出错,如粤康码检测出“非粤康码”,这是由于图片清晰度差造成的。

       进一步地,二维码可以结合图片文字识别等功能组合实现更多应用,另外,本实验存在许多不足之处,希望未来继续改善。