許美珍,武建新
(內(nèi)蒙古工業(yè)大學(xué)機械學(xué)院,內(nèi)蒙古呼和浩特 010051)
雪糕棒檢驗是依據(jù)圖像識別技術(shù)針對出口雪糕棒表面污染、破損、尺寸不合格等問題設(shè)計的在線產(chǎn)品檢驗的設(shè)備。該設(shè)備利用傳送帶將雪糕棒依次通過視覺檢測設(shè)備完成次品的剔除。為了替代生產(chǎn)中人類檢測雪糕棒的工作,同時效率也能兼?zhèn)洌侍岢隽吮容^高效的圖像處理算法。
本設(shè)計采用的是版本是 OpenCV2.4.8,要在VS2010中利用OpenCV進行圖像處理,需要在VS環(huán)境下對OpenCV做相應(yīng)的配置,使得VS在編譯的時候能夠調(diào)用OpenCV中的庫函數(shù)和頭文件[1]。
不同類型的圖像內(nèi)部結(jié)構(gòu)不同,需要根據(jù)圖像的結(jié)構(gòu)采用不同的方法將圖像文中的數(shù)據(jù)讀入內(nèi)存。OpenCV是一個C函數(shù)庫,既實現(xiàn)了基礎(chǔ)設(shè)施的操作,也實現(xiàn)了圖像處理和視覺函數(shù)[2]。IplImage數(shù)據(jù)結(jié)構(gòu)是圖像在內(nèi)存內(nèi)的數(shù)據(jù)組織形式。讀取圖像函數(shù)是cvLoad Image,即給定一個文件的路徑,該函數(shù)從這個文件中讀入一個圖像,此文件存儲的圖像由工業(yè)相機捕捉。
在OpenCV中的highgui庫,可以通過cvNamed-Window函數(shù)創(chuàng)建窗口,然后用cvShow Image函數(shù)在剛創(chuàng)建的窗口中顯示圖像,也就是通過IplImage指針指定的圖像。
本設(shè)計程序應(yīng)用了cvShow Image()來顯示圖像,就必須用到cvWaitKey()函數(shù)使程序暫停,cvWaitKey()是專門在OpenCV的GUI界面下等待鍵盤命令,能使用戶很好觀察到圖像。cvReleaseImage()cvDestroyWindow()用于釋放所占用的內(nèi)存。雪糕棒檢驗需要處理大量的圖像,在處理工程中這將會占用很大的內(nèi)存,在運作工作中將會溢出導(dǎo)致工作中斷,所以必須在處理圖像后需釋放內(nèi)存,方便后續(xù)處理。
圖像處理的效果在很大程度上取決于圖像的質(zhì)量,圖像預(yù)處理旨在消除圖像中的干擾信息,恢復(fù)真實信息,增強有關(guān)信息的可檢測性和最大限度地簡化數(shù)據(jù),從而加強特征提取、圖像分割、匹配和識別等圖像處理的可靠性。
2.4.1 光源校正
如圖1、2所示,對于圖像光照不均勻的,其輪廓等將不能很好的顯現(xiàn)處理。這種方法能夠?qū)D片中的細(xì)節(jié)更多地體現(xiàn)出來,從而糾正了檢測過程中由于光線不足引起灰度不均勻,使得圖像質(zhì)量提高,提高了檢測精度。運用VS并調(diào)用OpenCV視覺庫編程,對其進行光源校正處理,糾正了檢測過程中由于光線不足引起灰度不均勻。次品剔除程序中光源校正函數(shù)為Lightcorrection(IplImage* OriginalImage,IplImage*CorrectImage,double a[])。函數(shù)實現(xiàn)功能:對原始采集的圖像進行光源的校正。
圖1 雪糕棒原圖像
圖2 雪糕棒外接輪廓圖像
2.4.2 圖像的二值化
二值圖像是每個像素都只有黑、白色的圖像,首先設(shè)置一個閾值,然后將圖像上的像素點值大于閾值的用255代替,小于閾值的用0取代。通過選擇不同的閾值將256個灰度等級的原始圖像轉(zhuǎn)化為二值圖像[3],并且轉(zhuǎn)化后的二值圖像依然能反映出原始圖像的整體信息和局部特征點,并且有利于減小圖像的信息量。二值化圖像處理的閾值,可以跟據(jù)實際需要進行合理選擇。經(jīng)過對比,雪糕棒圖像的閾值選取80。
2.4.3 圖像尋找最大輪廓
OpenCV中繪制輪廓的函數(shù):cvDrawContours,根據(jù)實際要求max_level取0(繪制輪廓的最大等級),為繪制單獨的輪廓;thickness取1(繪制輪廓時所使用的線條的粗細(xì)度);line_type取8(線條的類型)。本程序查詢雪糕棒最大輪廓CvSeq* cmax=first_contour;利用循環(huán)結(jié)構(gòu)體指針查找最大輪廓。
圖3 雪糕棒最小外接矩形
尋找到雪糕棒最大輪廓后,依據(jù)最小外接矩形函數(shù),畫出雪糕棒最大輪廓的最小外接矩,如圖3,是為了得到矩形框上圖像的數(shù)據(jù),包括點的坐標(biāo)等,為下一步算法的建立做鋪墊。還需將圖像旋轉(zhuǎn)至水平(cvGetQuadrangleSubPix(pLighted Img,pRotatedImg,&cMat);)。
2.4.4 最大輪廓的填充
在次品剔除程序中對雪糕棒最大輪廓的填充,是為了區(qū)分輪廓內(nèi)外的灰度值,從而依據(jù)迭代器算法判斷灰度值對雪糕棒進行形狀檢測。
在OpenCV中迭代器cvInitLineIterator是對任意直線上的像素進行采樣,只要定義了線段的起始點和終止點就可以對這條線段上所有點進行采樣,這樣就得到兩點之間的像素點數(shù)目和每個像素點的灰度值等[4]。
在次品剔除程序中利用迭代器統(tǒng)計兩點之間點個數(shù),并且輸出每個點的灰度值的功能將迭代器函數(shù)循環(huán),判斷二值化圖像灰度值為255的點(即白色點)的個數(shù),將統(tǒng)計得到寬/長度方向的白點個數(shù)與沒有缺肉情況下標(biāo)準(zhǔn)白點個數(shù)比較從而判斷是否有缺肉情況,達(dá)到形狀檢測的目的。
建立并初始化迭代器后,可以連續(xù)通過調(diào)用CV_NEXT_LINE_POINT獲取線段上點的坐標(biāo)。本程序首先建立了 pt[1]到 pt[2]和 pt[0]到 pt[3]兩個迭代器,定義了ptd[10000]和 pte[10000]兩個數(shù)組分別存放線段上點的坐標(biāo)值。
提取坐標(biāo)點的關(guān)鍵函數(shù):offset=iterator1.ptr(uchar*)(mask->imageData);
為了驗證迭代器取點的準(zhǔn)確性以及為下一步程序做鋪墊,次品剔除程序中采用了迭代器畫線程序。函數(shù)原型:cvLine(CvArr* img,CvPoint pt1,CvPoint pt2,CvScalar color,int thickness=1,int line_type=8,int shift=0);指定線條顏色的時候用到的宏 CV_RGB(r,g,b)定義為#define CV_RGB(r,g,b)cvScalar((b),(g),(r),0),由此可見,實際上起作用的顏色是看cvScalar中的b,g,r順序,線段顏色就不言而喻了。
對雪糕棒模板圖像,即對最大外接輪廓填充后的圖像進行迭代器算法。通過循環(huán)建立迭代器遍歷圖像內(nèi)部所有像素點,判斷灰度值并統(tǒng)計灰度值為255的點個數(shù)(即白點個數(shù)),將統(tǒng)計得到的白點個數(shù)與標(biāo)準(zhǔn)白點個數(shù)比較從而判斷是否有缺肉情況,從而實現(xiàn)形狀檢測的目的。由于圖像是未經(jīng)過旋轉(zhuǎn)輪廓的,所以遍歷所有像素點要通過連續(xù)調(diào)用CV_NEXT_LINE_POINT(iterator)來實現(xiàn)從上一個像素點移到下一個像素點的功能。在檢測程序中要定義一個一維數(shù)組并進行初始化,初始化函數(shù)為memset(a,0,sizeof(a));將統(tǒng)計得到的白點個數(shù)累加到該數(shù)組中,最后統(tǒng)計結(jié)果為:縱向白點個數(shù)為117左右,橫向白點個數(shù)為1 396左右。
利用迭代器算法中iterator.ptr[]可以顯示圖像內(nèi)部任意點的灰度值的功能,將迭代器循環(huán)建立遍歷圖像內(nèi)部所有像素點的灰度值。這里用到的遍歷方法與統(tǒng)計白點個數(shù)的相同,將所有點灰度值累加后除以點個數(shù)得到雪糕棒圖像的灰度平均值[5]。本程序得到的灰度平均值為134,并且創(chuàng)建灰度級范圍100~255的一維灰度直方圖。
由運行結(jié)果,利用旋轉(zhuǎn)輪廓圖像處理程序的運行時間則為0.134 s左右,而利用迭代算法運行時間為0.013 s左右,分析可得采用迭代算法比旋轉(zhuǎn)輪廓的檢測效率高10倍左右,這樣會大大提高企業(yè)在生產(chǎn)實際中的生產(chǎn)效率,節(jié)約成本。這也是本程序采用迭代算法要實現(xiàn)的最終目的。
針對出口雪糕棒表面污染、破損、尺寸不合格等問題設(shè)計合適的算法,通過Microsoft Visual Studio 2010和OpenCV2.4.8編制程序,最終通過雪糕棒圖像預(yù)處理,包括二值化、尋找最大輪廓、輪廓填充、尋找最小外接矩形;并且運用迭代算法建立迭代器從而實現(xiàn)雪糕棒次品剔除的目的。
[1] 于仕琪,劉瑞禎.學(xué)習(xí) OpenCV(中文版)[M].北京:清華大學(xué)出版社,2009.
[2] 章毓晉.圖像處理和分析技術(shù)[M].第二版.北京:高等教育出版社,2008.
[3] 朱 虹.?dāng)?shù)字圖像處理基礎(chǔ)[M].北京:北京科學(xué)出版社,2005.
[4] 方 玫,喻擎蒼,李華強,等.C++下基 于OpenCV的數(shù)字圖像的處理[J].計算機工程與設(shè)計,2008,29(4):882-884.
[5] 黃 佳.基于0PENCV的計算機視覺技術(shù)研究[D].上海:華東理工大學(xué),2012.