姬 賀,陳亞軍,劉 雪,馬 登
(西華師范大學(xué) 電子信息工程學(xué)院,四川 南充 637001)
隨著智能制造技術(shù)的高速發(fā)展,商家為了凸顯產(chǎn)品唯一性,更加方便快捷地進(jìn)行信息管理,將有關(guān)本商品的大量相關(guān)信息印刷于外包裝盒上,如產(chǎn)品名稱、產(chǎn)品品牌等。因此對藥廠的商品鏈來說,藥盒的信息正確識別以及提高其識別的效率,有著十分重要的意義。本文基于機(jī)器視覺技術(shù),利用手機(jī)攝像頭對藥盒信息進(jìn)行拍取,對藥盒產(chǎn)品的信息進(jìn)行識別,為后續(xù)藥品的管理、分揀等工序提供方便[1,4]。
OpenCV軟件庫是一個基于BSD許可(開源)發(fā)行的開源計(jì)算機(jī)視覺庫,可以運(yùn)行在多個操作系統(tǒng)上,如Linux,Windows,Android和Mac OS等。它具有輕量級且能夠進(jìn)行高效計(jì)算等優(yōu)點(diǎn),而且本身是由C函數(shù)和少量C++類構(gòu)成,并且由C++語言編寫并進(jìn)行了深度優(yōu)化,從而可以享受多線程處理的優(yōu)勢,同時提供了多種語言的接口,從而幫助人們快速地建立計(jì)算機(jī)視覺應(yīng)用。OpenCV的應(yīng)用領(lǐng)域十分廣泛,包括圖像拼接、圖像降噪、產(chǎn)品質(zhì)檢、人機(jī)交互、人臉識別、動作識別、動作跟蹤、無人駕駛等[5]。本設(shè)計(jì)利用OpenCV內(nèi)置的一些算法對藥盒上的信息檢測,一定程度上提升了開發(fā)效率。
基于OpenCV軟件庫的檢測設(shè)計(jì),主要包括圖像采集模塊以及基于OpenCV庫的檢測模塊。由于不同藥盒的條形碼的放置的位置通常是不同的,因此本設(shè)計(jì)采用智能手機(jī)(iphoneX)拍取有藥盒條形碼的一面并將圖像上傳至系統(tǒng)進(jìn)行檢測。經(jīng)過試驗(yàn),可以得出該檢測方案成本低,效果也比較良好。
條形碼是按照一定的編碼規(guī)則將不同的條和空排列組合起來的,表示一些特定的信息,如字符、數(shù)字等。條形碼具有制作簡單、信息采集快、可靠性強(qiáng)、自由度大等特點(diǎn)。一條完整的條形碼的符號結(jié)構(gòu)通常是由靜區(qū)、起始字符、數(shù)據(jù)字節(jié)、校驗(yàn)字符、終止字符、靜區(qū)依次組成[6]。
基于OpenCV庫的條形碼檢測識別方法,需要對條形碼進(jìn)行圖像讀取,進(jìn)行圖像預(yù)處理,再用OpenCV內(nèi)置的圖像檢測算子進(jìn)行檢測,最后傳入深度學(xué)習(xí)中的卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行識別。這種方法,不僅速度快,而且抗外部干擾能力也比較好,大多可以準(zhǔn)確識別藥盒的條形碼及相關(guān)數(shù)字信息。OpenCV檢測條形碼的主要流程,如圖1所示。
圖1 OpenCV識別條形碼流程
(1)cv2.imread:在識別條形碼的第一步操作,需要將圖像載入軟件當(dāng)中,建立一個image,方便對圖像進(jìn)行后續(xù)的處理。常用用法為cv2.imread(filename,flags):filename讀入image的完整路徑;flags標(biāo)志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED};cv2.IMREAD_COLOR默認(rèn)參數(shù),讀入一副彩色圖片,忽略alpha通道,可用1作為實(shí)參替代;cv2.IMREAD_GRAYSCALE讀入灰度圖片,可用0作為實(shí)參替代;cv2.IMREAD_UNCHANGED讀入完整圖片,包括alpha通道,可用-1作為實(shí)參替代。
(2)cv2.Sobel:利用Sobel邊緣檢測提取我們image的輪廓。常用用法為cv2.Sobel(src,ddepth,dx,dy,dst,ksize)。
src表示需要處理的圖像;ddepth表示圖像的深度;dx和dy表示對圖像求導(dǎo)的階數(shù);dst表示操作處理后的圖像為dst;kisze表示Sobel算子的大小。
(3)cv2.getStructuringElement:來生成不同形狀的結(jié)構(gòu)元素。常用用法為矩形MORPH_RECT;交叉形MORPH_CROSS;橢圓形MORPH_ELLIPSE。
(4)cv2.dilate:將前景物體變大,理解成將圖像斷開裂縫變小(在圖片上畫上黑色印記,印記越來越?。?。常用用法為cv2.dilate(src,kernel,iterations)。
src表示需要處理的圖像;kernel配合cv2.getStructuringElement使用,使用指定形狀和尺寸的結(jié)構(gòu)元素(內(nèi)核矩陣);iterations表示迭代使用該函數(shù)的次數(shù)。
(5)cv2.erode:將前景物體變小,理解成將圖像斷開裂縫變大(在圖片上畫上黑色印記,印記越來越大)。常用用法與cv2.dilate()中的參數(shù)用法幾乎相同。
(6)cv2.imencode:將圖片轉(zhuǎn)換為數(shù)據(jù),通常是np.unit8格式。
(7)cv2.imdecode:從指定的內(nèi)存緩存中讀取數(shù)據(jù),并把數(shù)據(jù)轉(zhuǎn)換(解碼)成圖像格式。
(8)cv2.matchTemplate:將目標(biāo)圖片與模板圖片進(jìn)行模板匹配。模板匹配就是在包含目標(biāo)圖片的模板圖片上搜索目標(biāo),該目標(biāo)同模板有相同的尺寸、方向和圖像元素,通過內(nèi)置的算法可以在圖中找到目標(biāo)。
通過以上對OpenCV關(guān)鍵算子的應(yīng)用,將拍取到的藥盒包裝印刷的條形碼圖片進(jìn)行檢測并核對真實(shí)數(shù)據(jù),檢測軟件得到正確的結(jié)果,如圖2所示。
圖2 條形碼檢測結(jié)果
本文主要基于python語言利用OpenCV庫,對藥盒的條形碼進(jìn)行了檢測并識別,利用OpenCV的形態(tài)學(xué)操作算子檢測到條形碼信息。因?yàn)樗幒袟l形碼信息大多都是阿拉伯?dāng)?shù)字,筆者通過模板匹配對此進(jìn)行了識別。結(jié)果表明,筆者設(shè)計(jì)的條形碼檢測識別系統(tǒng)結(jié)果比較準(zhǔn)確,效率也比較高,具有一定的實(shí)用意義。