朱玥,郭依正,詹雪敏
(南京師范大學泰州學院,江蘇泰州,225300)
隨著智能手機和通信網絡技術的發展,二維碼(二維條碼)識別技術已廣泛應用于電子商務、物流、餐飲、交通、信息安全等領域[1-3]。而機器人工程是現在產業發展的主流方向之一,機器人的應用領域也在逐步擴大。讓機器人具有視覺能力,快速準確的識別二維碼,也是諸多應用場景的需要。
QR(Quick Response Code,快速響應矩陣碼)二維碼具有存儲的信息量大、抗噪能力強、識別快、無需依附數據庫等優點,是市場的主流,應用最為廣泛。對QR碼的研究,目前主要集中在光照不均處理、噪聲的消除、斜視畸變校正等幾個方面[4],比如對于二維碼去噪,高欣欣等人提出了一種迭代均值濾波算法[5],比如對于二維碼畸變校正,歐福超等人提出結合透視變換和插值運算的校正算法[6],在二維碼定位算法方面,劉宏偉等人提出了一種基于Hough變換和投影算法定位二維碼邊界[7]。QR碼包括功能圖像和編碼區兩部分,如圖1所示。因為二維碼已經應用的非常廣泛,如移動支付、身份校驗、數據下載、信息顯示、餐飲、物流等等,所以諸多軟硬件都集成了掃碼功能。本文以應用最廣泛的QR碼為例,闡述了一種機器人系統結構,及其基于此的二維碼的預處理、定位和識別過程,并且做了實驗驗證。

圖1 QR碼的結構
如圖2所示,給出了一種典型的機器人系統結構。該結構分為四層,上層智能手機為操控端,通過藍牙、GPRS等連接樹莓派進而發出相關指令,樹莓派(Raspberry Pi)通過讀取攝像頭獲取外部圖像并識別,Arduino單片機為下位機,可以連接各類傳感器,典型的如溫濕度傳感器、火焰傳感器、紅外接收傳感器、紅外熱釋電運動傳感器等等,最底層為機器人的機械裝置。

圖2 機器人系統結構
要想在該系統結構上實現基于OpenCV (Open Source Computer Vision Library)的機器人二維碼識別,需要熟悉樹莓派、Python、OpenCV等。樹莓派是一款基于ARM的微型電腦主板,以SD卡為硬盤,支持安裝類Linux系統,體積小但功能齊全,可以完成一臺普通PC機能做的諸多事情,可謂是“麻雀雖小,五臟俱全”;Python是一種面向對象的解釋型程序設計語言,易學易用,既支持對數據進行分析,也可以分析智能硬件,是目前人工智能、機器視覺等領域的首選語言;OpenCV是一種跨平臺計算機視覺庫,對許多通用的圖像處理算法進行了封裝,OpenCV還提供了Java、Python、CUDA等的接口,讓圖像處理和圖像分析的使用變得更加方便。
二維碼預處理是二維碼定位與識別的基礎,其主要工作包括圖像類型的轉換、圖像邊緣檢測、數學形態學處理等。
(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:結構元素。
現實中拍攝的二維碼圖像,或多或少的會包含一些背景信息。因此,在二維碼預處理后,需要進行邊界提取從而定位出二維碼,繼而提高識別精度和速度。邊界的提取使用OpenCV中的cv2.findContours()函數實現[8,9],該函數可以對二值圖像進行輪廓檢索,然后返回檢測到的輪廓數。接著,計算邊界最小包圍正方形,就可以定位出二維碼區域。
在OpenCV中,cv2.findContours()的函數原型如下:

必選參數含義分別如下,src:原始圖像,mode:檢測邊緣的方式,method:輪廓的近似方法。本示例中mode取值cv2.RETR_EXTERNAL,method取值cv2.CHAIN_APPROX_SIMPLE。
最后一步是二維碼識別,二維碼識別需要使用zbar庫,需要在終端使用sudo命令安裝,在代碼實現上,只需要加載該庫,并使用zbar.ImageScanner()進行掃描即可。
為了驗證方法的有效性,在仿人機器人上做了實驗。如圖3所示,為機器人實物,并給出了樹莓派和攝像頭的連接。如圖4所示,給出了二維碼定位結果示例,進而成功識別出二維碼信息為“你好”。實驗較好的驗證了本文所述的基于OpenCV的機器人二維碼識別方法的可行性和正確性。

圖3 機器人實物

圖4 二維碼定位示例
本文論述了一種基于OpenCV的機器人二維碼識別方法,在給出了系統結構的基礎上,詳述了二維碼預處理、二維碼定位與識別等各個步驟,其中二維碼預處理重點講述了圖像類型轉換、圖像邊緣檢測和灰度化后的二值圖像數學形態學處理,并做了仿真實驗。對于開發和設計需要二維碼識別功能的機器人提供了參考。