鄭帥兵 賈小軍 季漢華
摘要:隨著計(jì)算機(jī)硬件性能不斷提升和圖像處理技術(shù)的不斷發(fā)展,基于機(jī)器視覺(jué)的無(wú)接觸檢測(cè)技術(shù)在各個(gè)行業(yè)得到了廣泛的應(yīng)用,相關(guān)技術(shù)應(yīng)用于PCB元件的缺陷檢測(cè)已經(jīng)成為可能。利用OpenCV視覺(jué)庫(kù)對(duì)有出廠(chǎng)的PCB元件進(jìn)行預(yù)處理(閾值分割、平滑濾波、邊緣處理等),然后將處理校正后的PCB圖像與模板圖像進(jìn)行對(duì)比校對(duì),確定匹配的細(xì)節(jié)部分,從而確定出廠(chǎng)PCB元件是否存在缺陷。實(shí)驗(yàn)表明采用OpenCV進(jìn)行圖像處理與傳統(tǒng)方法相比,檢測(cè)效率高,程序集成度高。
關(guān)鍵詞:圖像處理;PCB元件;缺陷檢測(cè);OpenCV
中圖分類(lèi)號(hào):TP18 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)26-0214-03
Defect Detection of PCB Components Based on OpenCV
ZHENG Shuai-bing, JIA Xiao-jun, JI Han-hua
(College of Mathematics Physics and Information Engineering, Jiaxing University, Jiaxing 314001, China)
Abstract: With the development of the technology about computer and image processing, non-contact detecting technology based on machine vision has been widely used, and it has been becoming possible to apply the related technology in the defect detecting of PCB component. By means of the OpenCV vision library, PCB components image is processed through smoothing filter, binarization processing and edge detecting. Then, compare the processed PCB image with the standard template image to determine whether there are defects on PCB component. Experimental results show that compared to the traditional methods, using OpenCV for image processing can improve the efficiency of detection and the integration of program.
Key words: Image processing; PCB component; Defect detecting; Open CV
印刷電路板PCB(Printed Circuit Board)是電子元器件的載體,可以實(shí)現(xiàn)電子元器件自動(dòng)插裝或貼裝,如CPU芯片,電解電容,電阻等。在生產(chǎn)過(guò)程中會(huì)出現(xiàn)各種各樣的問(wèn)題,比如油印、微蝕等,會(huì)影響到元件的工作精度和可靠性,甚至造成不可挽回的損失。所以,PCB元件的缺損檢測(cè)是加工生產(chǎn)中必不可少的環(huán)節(jié),具有重要意義。目前的PCB元件缺陷檢測(cè)方法是人工檢測(cè),電測(cè)試和X射線(xiàn)測(cè)試方式[1]。但是這些方法費(fèi)力、生產(chǎn)效率低。為了提高生產(chǎn)效率,提高產(chǎn)量,針對(duì)優(yōu)化PCB元件缺陷檢測(cè),本文研究基于數(shù)字圖像處理技術(shù)的檢測(cè)方法。這種數(shù)字圖像處理技術(shù)主要依靠OpenCV視覺(jué)庫(kù)處理圖像。使用OpeCV 3.0在VS 2008環(huán)境下對(duì)PCB的缺陷檢測(cè)。
1二值化檢測(cè)法
數(shù)字圖像處理技術(shù)主要研究有數(shù)字化圖像、圖像編碼、圖像的增強(qiáng)和復(fù)原、圖像描述、圖像識(shí)別等[2]。圖像處理方法可分為二種:第一種包括各種幾何變換方法,特點(diǎn)是將圖像通過(guò)幾何方法,變換到其他頻域中進(jìn)行處理后,再變換到原來(lái)的域中。第二種方法是數(shù)學(xué)形態(tài)學(xué)運(yùn)算,它區(qū)別于常見(jiàn)的頻域和空域,是建立在積分幾何和集合論基礎(chǔ)上的運(yùn)算。
PCB元件是一種體積偏小、色彩單一的元器件,對(duì)檢測(cè)精度有較高要求。另外,PCB元件的檢測(cè)屬于全面檢測(cè),注重檢測(cè)速率的快慢。綜合考慮圖像處理須接受較好的光照及形成較高的圖像質(zhì)量,采用傳統(tǒng)圖像二值化檢測(cè)法[3-4]。
2 OpenCV視覺(jué)庫(kù)
OpenCV計(jì)算機(jī)視覺(jué)庫(kù)是由一些基本的C函數(shù)和C++類(lèi)所組成的函數(shù)庫(kù),用來(lái)實(shí)現(xiàn)計(jì)算機(jī)圖像算法,解決復(fù)雜困難的計(jì)算機(jī)圖像處理問(wèn)題。該庫(kù)的所有代碼都經(jīng)過(guò)優(yōu)化,計(jì)算效率很高,主要用于對(duì)圖像進(jìn)行高級(jí)處理,例如特征檢測(cè)與跟蹤[5-6]。它的主要方向是提供良好的機(jī)器視覺(jué)接口函數(shù),讓復(fù)雜的機(jī)器視覺(jué)產(chǎn)品可以更好的供人們使用。OpenCV視覺(jué)庫(kù)非常龐大,包含了有橫跨工業(yè)產(chǎn)品檢測(cè)、醫(yī)學(xué)圖像處理、安防、用戶(hù)界面、攝像頭標(biāo)定、三維成像、機(jī)器視覺(jué)等領(lǐng)域的超過(guò)500個(gè)接口函數(shù)[7]。因此,它目標(biāo)成為一種用于實(shí)時(shí)系統(tǒng)的視覺(jué)開(kāi)源庫(kù)。
3 PCB元件缺陷檢測(cè)過(guò)程
3.1 檢測(cè)流程
OpenCV視覺(jué)庫(kù)提供圖像處理函數(shù),對(duì)PCB元件進(jìn)行平滑處理、邊緣檢測(cè)等全面處理,較完整地獲取PCB元件中存在的缺陷,檢測(cè)流程如圖1所示。
3.2 PCB元件檢測(cè)過(guò)程
3.2.1 圖像去噪
去除圖像噪聲的常用方法有鄰域平均法均值濾波器、中值濾波、自適應(yīng)維納濾波器、小波去噪等。實(shí)驗(yàn)采用的是中值濾波方法,它的原理是將數(shù)字序列中某一點(diǎn)的值用該點(diǎn)一個(gè)鄰域中各點(diǎn)值的中值替換,其主要功能是讓周?chē)袼鼗叶戎档牟畋容^大的像素改取與周?chē)南袼刂到咏闹?,從而可以消除孤立的噪聲點(diǎn)[8],它對(duì)脈沖噪聲有良好的濾除作用,特別是在濾除噪聲的同時(shí),使邊緣不被模糊。此外,中值濾波的算法比較簡(jiǎn)單,也易于實(shí)現(xiàn)。
中值濾波的方法是采用一個(gè)長(zhǎng)度為奇數(shù)的二維滑動(dòng)窗口,設(shè)定某一個(gè)時(shí)刻,對(duì)這窗口內(nèi)的信號(hào)樣本值按照像素值的大小進(jìn)行排序。二維中值濾波輸出公式為:
[g(x,y)=med{f(x-k,y-1),(k,1∈w)}] (1)
其中,[f(x,y)],[g(x,y)]分別為未處理圖像和處理后圖像;W為二維模板,取以目標(biāo)像素為中心的一個(gè)領(lǐng)域子矩陣窗口,對(duì)窗口內(nèi)的像素灰度值進(jìn)行排序,用數(shù)據(jù)序列的中值代替中心點(diǎn)的灰度值。
OpenCV中提供的平滑濾波函數(shù)如下:
void cvSmooth(const CvArr* src, CvArr* dst, int smooth_types=CV_MEDIAN, int parameter1=3, int parameter2=0; double parameter3=0, double parameter4=0);
其中smooth_types取以下幾種值。
CV_MEDIAN:對(duì)圖像進(jìn)行像素值為parameter1×parameter1的中值濾波。
CV_BLUR_NO_SCALE:對(duì)每個(gè)像素的parameter1×parameter2領(lǐng)域求和。
CV_BLUR:對(duì)每個(gè)像素parameter1×parameter2鄰域求和并做尺度變換1/(parameter1×parameter2)。
CV_GAUSSIAN:對(duì)圖像進(jìn)行像素值為parameter1×parameter2的高斯卷積。
CV_BILATERAL:應(yīng)用雙向3x3濾波,彩色sigma=parameter1,空間sigma=parameter2。
利用OpenCV提供的函數(shù)實(shí)現(xiàn)對(duì)PCB元件圖像的處理,得到濾波圖像,結(jié)果如圖2所示。
3.2.2 閾值分割
使用閾值分割方法將圖像有效和圖像缺陷部分進(jìn)行分割,提取有效部分進(jìn)行處理,提高PCB圖像缺陷的識(shí)別精度和準(zhǔn)確度。這種方法特別適合用于背景占據(jù)不同灰度級(jí)的圖像,不僅可以很大程度地壓縮數(shù)據(jù)量,而且也簡(jiǎn)化了分析和處理步驟,提高生產(chǎn)效率。
最常見(jiàn)的閾值分割是固定閾值分割方法,OpenCV提供了固定閾值分割方法的函數(shù):
void cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
其中,
src:初始數(shù)組,數(shù)值為8-bit或者32-bit浮點(diǎn)數(shù)。
dst:輸出數(shù)組,必須與src的類(lèi)型一致。
threshold:閾值。
max_value:使用CV_THRESH_BINARY和CV_THRESH_BINARY_INV的最大值。
threshold_type:閾值類(lèi)別。
利用OpenCV視覺(jué)庫(kù)檢測(cè)閾值分割函數(shù),實(shí)現(xiàn)對(duì)PCB元件圖像的分割,結(jié)果如圖3所示。
3.2.3 邊緣檢測(cè)
常用的一階邊緣算子有Prewitt 算子和Canny算子等。本實(shí)驗(yàn)采用的是Canny算子[9]。Canny算子有以下3大優(yōu)點(diǎn):
(1) 圖像邊緣信息的漏檢、誤檢率較小,圖像的檢測(cè)整體效果較好。
[SNR(f)=-wwG(-x)f(x)dxσ-wwf2(x)dx] (2)
(2) 實(shí)現(xiàn)高精度的定位,Location越大越好。
[Location=-wwG'(-x)f'(x)dxσ-wwf'2(x)dx] (3)
(3) 響應(yīng)次數(shù)最少,保證只有唯一像素點(diǎn)響應(yīng)。
[D(f')=π-∞∞f'2(x)dx-∞∞f(x)dx12] (4)
OpenCV提供的CvCanny函數(shù)原型如下:
void cvCanny( const CvArr* image, CvArr *edges, double threshold1, double threshold2, int aperture_size=3);
其中,
threshold1:第一個(gè)閾值。
threshold2:第二個(gè)閾值。
aperture_size:算子內(nèi)核大小。
采用OpenCV提供的cvCanny函數(shù)。運(yùn)用Canny算子進(jìn)行PCB元件的邊緣檢測(cè),實(shí)驗(yàn)結(jié)果如圖4所示。
在經(jīng)過(guò)以上處理之后,可以將檢測(cè)后的PCB元件圖像與標(biāo)準(zhǔn)模板PCB圖像進(jìn)行匹配,匹配成功后得到函數(shù)返回值,最終確定PCB元件的缺陷。OpenCV中提供的形狀比較的函數(shù)如下:
Double cvMatchShapes( const void* object1, constvoid* object2, int method, double parameter=0 );
其中,
object1:第一個(gè)輪廓或灰度圖像。
object2:第二個(gè)輪廓或灰度圖像。
Method:比較方式在以下3種方式中:CV_CONTOUR_MATCH_I1, CV_CONTOURS_MATCH_I2, CV_CONTOURS_MATCH_I3。
Parameter:數(shù)值參數(shù),函數(shù)匹配完成后,會(huì)返回一個(gè)匹配的數(shù)值,表明匹配程度。
利用OpenCV提供的匹配函數(shù),可以獲得相應(yīng)的匹配結(jié)果,如圖5所示。
3.2.4 實(shí)驗(yàn)與分析
模板的選擇會(huì)影響匹配的結(jié)果,模板選得太大,對(duì)較小的缺陷不敏感;而模板選得太小,像素點(diǎn)采集不夠,實(shí)驗(yàn)結(jié)果不準(zhǔn)確,容易產(chǎn)生誤差。實(shí)驗(yàn)采用[600
定義一個(gè)變量pcbResult,獲取函數(shù)的返回值。當(dāng)PCB元件沒(méi)有缺陷時(shí),pcbResult的值為0,但是,實(shí)際結(jié)果與理論存在一定的誤差,經(jīng)過(guò)反復(fù)試驗(yàn)、嚴(yán)格對(duì)比,使結(jié)果更加可靠,選取PCB存在缺陷的臨界值為0.2。所以,當(dāng)pcbResult等于0時(shí),圖像完全匹配,沒(méi)有缺陷;當(dāng)pcbResult小于0.2時(shí),認(rèn)為圖像基本匹配,不存在缺陷或缺陷不會(huì)影響PCB的正常使用。當(dāng)pcbResult大于0.2時(shí),則表明PCB元件存在缺陷,無(wú)法匹配。實(shí)驗(yàn)結(jié)果如圖6所示。
4 結(jié)論
OpenCV視覺(jué)庫(kù)免費(fèi),源代碼公開(kāi),具有強(qiáng)大的圖像處理能力,能在不同平臺(tái)移植使用,兼容性好,有利于減少運(yùn)行成本和程序運(yùn)行的可靠性。本文研究解決PCB元件缺陷的最佳方法,利用OpenCV視覺(jué)庫(kù)強(qiáng)大的圖像處理技術(shù),結(jié)合圖像濾波、邊緣檢等方法實(shí)現(xiàn)對(duì)PCB元件的缺陷檢測(cè)。經(jīng)實(shí)驗(yàn)證明,利用OpenCV對(duì)PCB元件缺陷檢測(cè)是比較高效可行的方法,具有較好的效果。尤其是利用OpenCV中的函數(shù),使原本復(fù)雜困難的圖像處理問(wèn)題變得簡(jiǎn)單易懂,易于上手,可見(jiàn)有很強(qiáng)的實(shí)用價(jià)值。眾所周知,OpenCV具有比較好的移植性,在各個(gè)開(kāi)發(fā)平臺(tái)都能很好運(yùn)行,未來(lái)可以將程序移植到嵌入式系統(tǒng)中,讓檢測(cè)系統(tǒng)消耗更少、效率更高、運(yùn)行更快捷。
參考文獻(xiàn):
[1] 熊光潔, 馬樹(shù)元. 基于機(jī)器視覺(jué)的高密度電路板缺陷檢測(cè)系統(tǒng)[J]. 計(jì)算機(jī)測(cè)量與控制,2011,19(8):1824-1825.
[2] 陳汗青, 萬(wàn)艷玲等. 數(shù)字圖像處理技術(shù)研究進(jìn)展[J]. 工業(yè)控制計(jì)算機(jī),2013,(1): 72-73
[3] 潘憶江,黃際彥. PCB中圓形圖像的自動(dòng)光學(xué)檢測(cè)研究[J].現(xiàn)代電子技術(shù),2014,37(8):69-70.
[4] 安寧, 林樹(shù)忠. 圖像處理方法研究及其應(yīng)用[J]. 儀器儀表學(xué)報(bào),2006,27(6):792-793.
[5] 秦小文, 溫志芳, 喬維維. 基于OpenCV的圖像處理[J]. 電子測(cè)試,2011(7):39-41.
[6] 方玫,喻擎蒼,李華強(qiáng).C++Builder 下OpenCV的數(shù)字圖像處理[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(4):882-883.
[7] 郭輝, 陳光. 基于OpenCV的視覺(jué)圖像處理應(yīng)用研究[J]. 微型機(jī)與應(yīng)用,2012(21):14-20.
[8] 王宇新,賀圓圓等.基于FPGA 的快速中值濾波算法[J].計(jì)算機(jī)應(yīng)用研究,2009,26(1):224-226.
[9] 姜玲燕,龐明勇.邊緣信息誘導(dǎo)的圖像矢量化算法[J].小型微型計(jì)算機(jī)系統(tǒng).2015,1(1):183-185.
[10] 晁越, 李中健. OpenCV圖像處理編程研究[J]. 電子設(shè)計(jì)工程. 2013(10):175-177.