朱春錦,黎鑫澤,朱建業,張 浩
(廣州大學,廣東 廣州 514000)
生活中我們偶爾會遇到購買的一箱牛奶中某一盒牛奶表面沒有吸管的情況,從而造成困擾。這是因為牛奶盒上的吸管在生產過程中難免會出現點膠不足或傳送帶運輸卡落的情況,導致最后裝箱時牛奶盒上沒有吸管。目前的牛奶生產廠家采用人工檢測的方式對吸管有無進行檢測,而在高速的流水生產線上,人工很容易因長時間工作而出現用眼疲勞,以至最后的生產效率難以保障。
當前,機器視覺技術[1-3]飛速發展,其在工業方面的檢測應用[4-5]也越來越多。目前,機器視覺技術在諸多方面的應用已比較成熟,例如:物體輪廓形狀識別、表面裂紋監測、人臉識別、字符識別等。但是國內現今并沒有人將機器視覺技術應用到吸管檢測上。
為此,本文提出了一種基于Haclon 的伊利牛奶盒吸管有無的檢測設計方案。使用模板匹配算法來提取吸管關鍵部分區域,再利用區域形態學運算來判斷奶盒表面是否存在吸管。該方案對光照要求低且可以代替人工檢測,從而提高吸管檢測效率和質量。
牛奶盒檢測算法的步驟如圖1所示。

圖1 吸管檢測算法流程
在檢測過程中,獲得圖像數據后,最終的目的是對吸管是否出現在圖像上的正確位置進行判斷。因為包裝的特性,如果牛奶盒表面有吸管,那么一定會遮擋住牛奶盒表面的圓形標簽如圖2 所示。本文設計的算法核心就在于檢測標簽區域是否存在吸管部分,如果存在則該牛奶盒表面有吸管,反之則牛奶盒表面沒有吸管。

圖2 采集的牛奶盒圖像
檢測的第一步,采集一張牛奶盒表面圖像作為標準圖像,并對其做一次灰度化處理。
為了在以后的檢測中每次都能準確定位到奶盒表面的圓形標簽區域,可以利用采集到的標準圖像上的二維碼區域創建一個模板圖像,每一次檢測中對待檢測圖像進行模板匹配,即可定位到待檢測圖像上的二維碼區域。因為奶盒的包裝特性,二維碼區域和標簽區域的相對位置始終是固定的,所以可以根據二者的位置關系準確定位到奶盒表面的標簽區域。
其算法流程是:選取標準圖像上的二維碼作為模板圖像,同時在標簽處繪制一個同標簽等大的圓形區域,記錄二維碼和圓形區域的位置和相互之間的位置關系。在檢測時,當二維碼區域匹配成功時即可獲得檢測圖像上的二維碼區域的位置,將該位置和二維碼模板的位置進行計算,獲得二維碼的仿射變換的關系矩陣,同時對繪制的圓形域用該矩陣進行仿射變換,仿射變換后圓形區域的位置即是檢測圖像上的圓形標簽處的位置。
互相關法是模板匹配的一種基本方法,其原理如下。文中設置的二維碼模板T(m,n)疊放在被搜索的牛奶盒圖S(W,H)中進行上下左右的平移,二維碼模板圖覆蓋住的原圖區域叫子圖,搜索范圍是:1 ≤i ≤W-n,1 ≤j ≤H-m。使用下式可以衡量T與Sij之間的相似性:

式中:(i,j)為子圖左下角在被搜索圖S 上的坐標,然后再將其結果歸一化,就可以得到模板匹配的相關系數:

當模板和子圖一樣時,相關系數R(i,j)=1,在被搜索圖S中完成全部搜索后,找出R的最大值Rmax(im,jm),其對應的子圖即為匹配目標。
根據模板匹配后我們定位到了目標區域(藍色標簽部分),為了節省算法的運算時間,選擇利用仿射變換后的圓形區域將標簽部分的圖像裁剪出來。只對裁剪后的圖像進行閾值處理,因為吸管和標簽部分的顏色對比度較大,如果吸管存在,使用閾值二值化便能很好地得到吸管區域。但是實驗表明,無論使用什么值作為閾值,二值化后的吸管部分始終會和背景部分存在連通的情況,無法使用面積特征直接篩選出吸管部分。因為二值化后的吸管部分和背景部分面積和形狀差距較大,為此考慮使用區域開運算的手法,將二值化后的其他干擾區域清除,只留下吸管區域。
開運算就是先對區域進行膨脹后再腐蝕,達到消除干擾區域的同時又能很好地保留想提取的目標區域。
膨脹和腐蝕時首先需要選取結構元S,其可以是任意形狀,以十字形為例(如圖3)。在結構元S中還要選取一個錨點o,我們一般將結構元的中心定為錨點,這里就是十字形的中心,為o 點。然后將S 在圖像f(如圖4)上進行滑動,f是一幅二值圖像,灰色區域代表1,白色區域為0。膨脹其過程就是把結構元錨點位置的像素灰度值設置為結構元值為1 的區域對應圖像區域像素的最大值。使用公式(3)表示,計算公式如下:

式中:(x,y)為錨點o 的位置,x′和y′為結構元值為1 的像素相對錨點o 的位置偏移,f表示原圖,dst 表示結果圖(如圖5)。
膨脹后的示意圖如下,讓人感覺就像是圖像中的目標區域膨脹變大了一樣。其中圖5 中的斜紋部分就是膨脹后多出的區域。

圖3 十字結構元

圖4 膨脹前的原圖

圖5 膨脹后的結果圖
腐蝕其過程就是把結構元錨點位置的像素灰度值設置為結構元值為1 的區域對應圖像區域像素的最小值。使用
公式(8)表示,計算公式如下:

式中:(x,y)為結構元S 錨點o 的位置,x′和y′為結構元值為1 的像素相對錨點o 的位置偏移,f表示原圖,dst 表示結果圖,如圖6所示。

圖6 腐蝕后的結果圖
腐蝕后的示意圖如下,視覺上就像原圖目標區域被“腐蝕”了一般。
對圖像f用同一結構元S 先腐蝕后膨脹成為開運算,其運算符號記為:

對圖4 使用圖3 做結構元開運算后的結果圖,如圖7 所示,其保留了目標區域的大致形狀。

圖7 開運算后的結果圖
為了得到吸管區域,對閾值后的標簽區域進行開運算,其效果就能很好地消除干擾區域,提取到吸管區域。
為了驗證上述的算法處理有效性,且能實現檢測奶盒表面是否存在吸管的目的,本文采用Halcon 軟件作為實驗環境,對本文算法進行驗證。
首先使用read_image ()將相機采集的一張圖像讀取到軟件中如圖2 所示。為了定位到感興趣的標簽區域,先手動在二維碼圖像處繪制一個等大的矩形區域和標簽處繪制一個等大的圓形區域,用area_center()得到兩個區域的中心坐標。用圓形坐標減去二維碼區域坐標,將得到進行仿射變換的關系坐標。使用reduce_domain()將二維碼從原圖中摳出,用create_shape_model()創建二維碼模板。前期的準備工作結束。隨后相機循環采集圖像,用find_shape_model()找到二維碼所在的位置,然后生成仿射變化矩陣,同時對圓形區域進行仿射變換。如此便定位到了標簽區域,將仿射變換后的圓形區域對檢測圖像進行摳圖處理,其結果如圖8所示。
由于吸管和背景區域的對比度差異明顯,所以使用閾值binary_threshold()算子就可以得到吸管區域,閾值后用connection()分割區域,就可得到下面的效果圖,圖9是奶盒有吸管的結果圖,圖10是奶盒沒吸管后的結果。

圖9 帶吸管閾值后圖

圖10 沒有吸管閾值后圖
因為吸管的形狀是矩形的,所以采用矩形的結構元素對閾值后的圖像進行開運算opening_rectangle1(),以達到消除干擾區域的目的。有吸管的圖像開運算后保留下了吸管區域如圖11 所示,而沒有吸管的圖像開運算后,則成為空區域如圖12所示。

圖11 有吸管圖開運算結果

圖12 沒有吸管開運算后結果
至此,使用count_obj()算子對開運算后的區域進行計數。如果區域數大于0,則說明有牛奶盒上有吸管存在;如果為0,則表示沒有吸管。
將本文的吸管檢測算法與傳統的流水線人工檢測相比,實驗結果如表1 所示,實驗設定每100 盒伊利純牛奶中有1盒沒有吸管。

表1 吸管檢測方法對比Tab.1 Comparison of pipette detection methods
從表1的對比結果來看,使用本文方法檢測的失誤率和所需要時間都比傳統的流水線人工檢測低,并且能夠滿足流水線的檢測速度要求。后續只要搭配一個合適的牛奶盒剔除裝置,通過計算開始采集到牛奶盒的時間t和傳送帶的速度v以及剔除裝置與采集裝置的距離S三者的關系,就可以讓電腦發出指令讓剔除裝置從流水線上剔除掉沒有吸管的牛奶。如此,便可以取代流水線上人工檢測,搭建成一套自動的檢測系統。
本文基于Halcon 軟件平臺,設計了伊利純牛奶盒表面吸管存在與否的檢測方法,使用機器視覺技術代替人工檢測。通過對圖像關鍵部位的區域提取和區域形態學運算,對吸管有無的情況進行判斷。實驗結果表明,檢測失誤率可達到0.00%,時間快于人工,且該方法對光照要求低,證明了該方法的可實現性和優越性。但本文并沒有設計出牛奶盒剔除裝置,搭建成一套完整的監測系統,為后文可以研究改進之處。