一种基于OpenCV的机器人二维码识别方法
2021-08-09朱玥郭依正詹雪敏
朱玥,郭依正,詹雪敏
(南京师范大学泰州学院,江苏泰州,225300)
0 引言
随着智能手机和通信网络技术的发展,二维码(二维条码)识别技术已广泛应用于电子商务、物流、餐饮、交通、信息安全等领域[1-3]。而机器人工程是现在产业发展的主流方向之一,机器人的应用领域也在逐步扩大。让机器人具有视觉能力,快速准确的识别二维码,也是诸多应用场景的需要。
QR(Quick Response Code,快速响应矩阵码)二维码具有存储的信息量大、抗噪能力强、识别快、无需依附数据库等优点,是市场的主流,应用最为广泛。对QR码的研究,目前主要集中在光照不均处理、噪声的消除、斜视畸变校正等几个方面[4],比如对于二维码去噪,高欣欣等人提出了一种迭代均值滤波算法[5],比如对于二维码畸变校正,欧福超等人提出结合透视变换和插值运算的校正算法[6],在二维码定位算法方面,刘宏伟等人提出了一种基于Hough变换和投影算法定位二维码边界[7]。QR码包括功能图像和编码区两部分,如图1所示。因为二维码已经应用的非常广泛,如移动支付、身份校验、数据下载、信息显示、餐饮、物流等等,所以诸多软硬件都集成了扫码功能。本文以应用最广泛的QR码为例,阐述了一种机器人系统结构,及其基于此的二维码的预处理、定位和识别过程,并且做了实验验证。
图1 QR码的结构
1 系统结构
如图2所示,给出了一种典型的机器人系统结构。该结构分为四层,上层智能手机为操控端,通过蓝牙、GPRS等连接树莓派进而发出相关指令,树莓派(Raspberry Pi)通过读取摄像头获取外部图像并识别,Arduino单片机为下位机,可以连接各类传感器,典型的如温湿度传感器、火焰传感器、红外接收传感器、红外热释电运动传感器等等,最底层为机器人的机械装置。
图2 机器人系统结构
要想在该系统结构上实现基于OpenCV (Open Source Computer Vision Library)的机器人二维码识别,需要熟悉树莓派、Python、OpenCV等。树莓派是一款基于ARM的微型电脑主板,以SD卡为硬盘,支持安装类Linux系统,体积小但功能齐全,可以完成一台普通PC机能做的诸多事情,可谓是“麻雀虽小,五脏俱全”;Python是一种面向对象的解释型程序设计语言,易学易用,既支持对数据进行分析,也可以分析智能硬件,是目前人工智能、机器视觉等领域的首选语言;OpenCV是一种跨平台计算机视觉库,对许多通用的图像处理算法进行了封装,OpenCV还提供了Java、Python、CUDA等的接口,让图像处理和图像分析的使用变得更加方便。
2 二维码预处理
二维码预处理是二维码定位与识别的基础,其主要工作包括图像类型的转换、图像边缘检测、数学形态学处理等。
(1)图像类型转换是将采集的彩色图像转换为灰度图像,可以使用OpenCV中的cv2.cvtColor()函数实现。当摄像头读入图像后,将读取的帧转为灰度图。函数形式如下:
有两个必选参数,src:原始图像,code:颜色空间转换方式。本示例中code取值为cv2.COLOR_BGR2GRAY。值得一提的是,在OpenCV中,彩色空间使用的BGR,即蓝-绿-红颜色空间。
(2)图像边缘检测可以使用OpenCV自带的cv2.Sobel()算子进行滤波。Sobel算子是常用的一种边缘检测算子,对边缘方向信息的提供比较精确,但由于不是完全精确的边缘定位,在对精度要求不是很高的情况下被经常采用。
Sobel算子是一个无方向的一阶微分边缘检测算子,Sobel算子的表达式如下:
其中Dx、Dy分别表示水平方向算子和垂直方向算子。矩阵形式的模板表示如下:
在OpenCV中,Sobel算子的函数原型如下:
dst=cv2.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,d elta[,borderType]]]]])
其中前四个参数是必须的,其余的可选。src:原始图像,ddepth:图像像素深度,dx,dy:x和y方向上是否求导。
(3)数学形态学处理是对二值化后的图像做开运算。二值化使用OpenCV中的cv2.threshold()函数实现,开运算主要作用是去毛刺、孤立点,同时基本保持原图形状信息不变,使用cv2.morphologyEx()函数实现。
在OpenCV中,cv2.threshold()的函数原型如下:
cv2.threshold(src,thresh,maxval,type[,dst])四个必选参数含义分别如下,src:原始图像,thresh:分割阈值,maxval:大于阈值的点设置为maxval的值,type:算法类型。本示例中type取值为cv2.THRESH_BINARY。
开运算一种复合运算,它是对二值图像先做腐蚀后做膨胀,公式表示如下所示,其中Θ代表腐蚀运算,⊕代表开运算,X为待处理的二值图像,B为结构元素:
在OpenCV中,cv2.morphologyEx()的函数原型如下:
必选参数含义分别如下,src:原始图像,op:运算类型,比如常见的开闭运算,op取值cv2.MORPH_OPEN时做的是开运算(先腐蚀后膨胀),op取值cv2. cv2.MORPH_CLOSE时做的是闭运算(先膨胀后腐蚀),kernel:结构元素。
3 二维码定位与识别
现实中拍摄的二维码图像,或多或少的会包含一些背景信息。因此,在二维码预处理后,需要进行边界提取从而定位出二维码,继而提高识别精度和速度。边界的提取使用OpenCV中的cv2.findContours()函数实现[8,9],该函数可以对二值图像进行轮廓检索,然后返回检测到的轮廓数。接着,计算边界最小包围正方形,就可以定位出二维码区域。
在OpenCV中,cv2.findContours()的函数原型如下:
必选参数含义分别如下,src:原始图像,mode:检测边缘的方式,method:轮廓的近似方法。本示例中mode取值cv2.RETR_EXTERNAL,method取值cv2.CHAIN_APPROX_SIMPLE。
最后一步是二维码识别,二维码识别需要使用zbar库,需要在终端使用sudo命令安装,在代码实现上,只需要加载该库,并使用zbar.ImageScanner()进行扫描即可。
4 实现效果
为了验证方法的有效性,在仿人机器人上做了实验。如图3所示,为机器人实物,并给出了树莓派和摄像头的连接。如图4所示,给出了二维码定位结果示例,进而成功识别出二维码信息为“你好”。实验较好的验证了本文所述的基于OpenCV的机器人二维码识别方法的可行性和正确性。
图3 机器人实物
图4 二维码定位示例
5 结束语
本文论述了一种基于OpenCV的机器人二维码识别方法,在给出了系统结构的基础上,详述了二维码预处理、二维码定位与识别等各个步骤,其中二维码预处理重点讲述了图像类型转换、图像边缘检测和灰度化后的二值图像数学形态学处理,并做了仿真实验。对于开发和设计需要二维码识别功能的机器人提供了参考。