宗加飛,王 浪,蔣寧通,張 偉,丁 玲
(湖北科技學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 咸寧 437100)
在20世紀(jì)60年代的早期,世界上第一次出現(xiàn)了能夠執(zhí)行數(shù)字圖像處理任務(wù)的計(jì)算機(jī),從此,數(shù)字圖像處理技術(shù)誕生了。學(xué)者M(jìn)arr在20世紀(jì)70年代晚期初步提出了視覺計(jì)算的基本理論,該理論成了計(jì)算機(jī)視覺理論出現(xiàn)后多年的非常重要的理論思想。計(jì)算機(jī)人工智能在20世紀(jì)80年代開始有了雛形并且發(fā)展得很快,導(dǎo)致計(jì)算機(jī)圖像處理技術(shù)也取得了進(jìn)一步的突破,之后也慢慢出現(xiàn)了人工智能的可視化技術(shù),該技術(shù)在理論和實(shí)際應(yīng)用上取得了明顯的成果。同時(shí)人們對圖像的研究更進(jìn)了一步,從之前的二維領(lǐng)域進(jìn)入了三維領(lǐng)域。數(shù)字圖像處理技術(shù)在20世紀(jì)90年代開始了很快的成長,最核心的方面是學(xué)者M(jìn)allat將小波理論應(yīng)用到圖像的分解和重構(gòu)上,這樣就能對圖像的局部進(jìn)行分析和研究。到了21世紀(jì),計(jì)算機(jī)視覺領(lǐng)域呈現(xiàn)許多新的趨勢,現(xiàn)在人們在對視覺研究的過程中,更加注重的是怎么樣通過計(jì)算機(jī)來模擬或模仿人的眼睛在獲取外界信息時(shí)的作用和功能,到后來就有了計(jì)算機(jī)視覺這門新興的有關(guān)計(jì)算機(jī)科學(xué)方面的學(xué)科,同時(shí),這門學(xué)科的出現(xiàn)也體現(xiàn)了科學(xué)家和計(jì)算機(jī)視覺方面相關(guān)的研究者和工作者們對視覺的研究已經(jīng)從理論慢慢地走向了更加科學(xué)的實(shí)踐。就目前來看,人們用計(jì)算機(jī)視覺技術(shù)在社會(huì)不同方面上開發(fā)和研究出愈來愈多的應(yīng)用,而不僅僅只是在手機(jī)、計(jì)算機(jī)上的應(yīng)用。
當(dāng)今在大規(guī)模工業(yè)生產(chǎn)過程中,由于人工視覺檢測容易疲勞且具有不一致性,會(huì)導(dǎo)致誤差或失誤比較大。如果采用計(jì)算機(jī)視覺的檢測方法,就會(huì)比單純地采用人工視覺檢測的方法具有更高的準(zhǔn)確率和檢測速度,會(huì)大大提高生產(chǎn)率,并且在一些危險(xiǎn)的檢測環(huán)境下,可以采取計(jì)算機(jī)視覺檢測的方式,減少風(fēng)險(xiǎn)和確保人身安全,這就是工業(yè)上非接觸式檢測的目的。本文設(shè)計(jì)的基于計(jì)算機(jī)視覺的物體測量方法對設(shè)備的要求很低,成本也很低,只需要一臺(tái)計(jì)算機(jī)和質(zhì)量比較好的攝像頭或者攝像機(jī),就能組成一個(gè)相對完善的測量系統(tǒng),能方便快捷地對各種物體尺寸進(jìn)行測量,并且適用于各個(gè)領(lǐng)域。
1.系統(tǒng)對物體的尺寸測量流程設(shè)計(jì)
系統(tǒng)測量的對象主要是規(guī)則物體,如方形盒裝物體等。該系統(tǒng)能測量目標(biāo)物體的外輪廓尺寸,并能根據(jù)測量到的尺寸計(jì)算出物體的面積和體積,在測量過程中盡量減少尺寸誤差,能最大程度上還原物體的真實(shí)尺寸信息?;谟?jì)算機(jī)視覺檢測系統(tǒng)的整體流程如圖1所示。
在用攝像頭拍攝物體的過程中,提前將物體與攝像頭之間的距離設(shè)定為30厘米且固定不變,采取垂直拍攝,這樣可以減少對相機(jī)進(jìn)行標(biāo)定操作,還可以減少在測量和計(jì)算攝像頭焦距時(shí)的誤差,能夠更有利于后續(xù)的計(jì)算機(jī)處理。
圖1 基于計(jì)算機(jī)視覺物體尺寸檢測系統(tǒng)的整體流程
2.系統(tǒng)總體設(shè)計(jì)
該系統(tǒng)硬件部分是一個(gè)攝像頭和一臺(tái)計(jì)算機(jī)構(gòu)成。軟件部分包括四個(gè)大的模塊:分別是圖像采集、圖像預(yù)處理、識(shí)別與測量和結(jié)果輸出模塊。圖像采集是使用攝像頭拍攝的圖片,然后將拍攝到的圖片傳輸保存在計(jì)算機(jī)中,再對圖片進(jìn)行預(yù)處理操作,包括濾波、二值化、圖像分割等,以便后續(xù)測量工作。然后再對預(yù)處理之后的圖片進(jìn)行物體尺寸測量,最后將測量得到的結(jié)果進(jìn)行輸出。該系統(tǒng)的整體框架圖如圖2所示。
圖2 基于計(jì)算機(jī)視覺檢測系統(tǒng)的整體流程
該系統(tǒng)中的四個(gè)大模塊也相當(dāng)于是對圖片進(jìn)行處理的四個(gè)步驟,主要是完成三個(gè)功能,即角點(diǎn)檢測、輪廓檢測和頂點(diǎn)計(jì)算。最后的結(jié)果輸出模塊基于之前的三個(gè)步驟,將處理好的圖片輸出到計(jì)算機(jī)中保存。
3.開發(fā)及運(yùn)行環(huán)境
該系統(tǒng)利用Python+OpenCV在Windows 10操作系統(tǒng)下借助Spyder3編輯器實(shí)現(xiàn)的,包括硬件平臺(tái)和軟件平臺(tái),其中硬件平臺(tái)和軟件平臺(tái)還有其它設(shè)備的主要參數(shù)如下:
(1)硬件平臺(tái)為:CPU(Core i5-6300HQ 2.3GHz),硬盤120G,運(yùn)行內(nèi)存8G。
(2)軟件平臺(tái)為:操作系統(tǒng)Windows10,Python3.7.0,OpenCV-Python 3.4.5,Spyder 3.3.3。
(3)本系統(tǒng)使用的攝像頭的主要參數(shù)如下:
·感光元件:CMOS
·攝像頭像素:1200萬
·分辨率:1600×1200
·鏡頭描述:五玻鏡頭
·接口類型:USB2.0
·最大幀頻:30FPS
1.圖像采集
圖像采集模塊是用計(jì)算機(jī)調(diào)用USB攝像頭對物體進(jìn)行拍照采集圖像。需要先將OpenCV的視頻流嵌入wxPython的框架中(wxPython是Python中的一套實(shí)用的GUI圖像庫),再用OpenCV自帶的cv2.VideoCapture()方法控制攝像頭。其中有三個(gè)功能按鈕,即打開攝像頭、關(guān)閉攝像頭、開始檢測。當(dāng)開啟攝像頭后,按下S鍵即可進(jìn)行圖片采集,并將圖片保存到計(jì)算機(jī)指定的文件夾內(nèi)等待下一步操作。
2.圖像預(yù)處理
在圖像采集過程中,不可避免地會(huì)混入一些噪聲和干擾,會(huì)導(dǎo)致圖像質(zhì)量下降,影響到圖像識(shí)別算法的可靠性和準(zhǔn)確性,因此,對圖像做分析之前一定要對圖像進(jìn)行預(yù)處理操作。其具體流程一般包括圖像的分割、圖像特征的提取、灰度化、幾何變換、圖像增強(qiáng)等。圖像灰度化的方法一般有分量法、最大值法、平均值法和加權(quán)平均法。圖像增強(qiáng)算法有空域方法和頻域方法這兩種。前者是一種非常直接的圖像增強(qiáng)算法,這種算法又細(xì)分為點(diǎn)算法和鄰域去噪算法。點(diǎn)操作算法包括灰度校正、灰度變換(也稱對比度拉伸)和直方圖校正。鄰域增強(qiáng)算法可分為圖像平滑和銳化。常用的平滑算法包括均值濾波、中值濾波和空間濾波。銳化常用算法有梯度算子法、二階導(dǎo)數(shù)算子法、高通濾波、掩模匹配法等。
(1)濾波處理
數(shù)字圖像的獲取與傳輸?shù)倪^程中會(huì)伴隨很多不同的噪聲一起,某些噪聲會(huì)干擾圖像本身的特征,并使后續(xù)操作變得困難,因此,需要對圖像進(jìn)行濾波操作,以減少噪聲和干擾。原圖像和進(jìn)行中值濾波及高斯濾波處理后的效果如圖3所示。
圖3原圖和經(jīng)過中值濾波處理后的圖像
(2)圖像二值化
圖像二值化能夠減少圖片數(shù)據(jù)量,同時(shí)突出檢測目標(biāo)。OpenCV中有兩個(gè)函數(shù)用于二進(jìn)制圖像:cvthreshold ( )和cvadaptivethreshold ( )。圖4所示的是經(jīng)過處理得到的二值圖像,能清晰顯示出背景和前景的色差情況。
(3)圖像分割
圖像分割是將圖像分布到不同的特定和獨(dú)特的區(qū)域并呈現(xiàn)特定對象的技術(shù)和過程。這是從圖像處理到圖像分析的重要一步。現(xiàn)有的圖像分割方法一般分為基于特定閾值的分割方法、在區(qū)域上的分割方法、邊緣分割方法等具體方法。OpenCV中具有的基于區(qū)域的grabCut算法,即cv.grabCut ()。圖5是原圖和經(jīng)過區(qū)域分割后的效果圖。
圖4 經(jīng)過二值化處理后的圖像 圖5 基于區(qū)域的圖像分割方法
(4)圖像邊緣檢測
圖像邊緣檢測結(jié)果是圖像分割結(jié)果不能得到的一系列的點(diǎn),需要進(jìn)一步的預(yù)處理,將邊緣點(diǎn)沿圖形邊界連接起來,就形成了一系列的邊緣。在Python中,Roberts算子是通過Numpy定義的模板,再調(diào)用OpenCV的filter2D( )函數(shù)實(shí)現(xiàn)邊緣提取。該函數(shù)主要利用核函數(shù)實(shí)現(xiàn)圖像的卷積。Sobel算子用于計(jì)算圖像亮度的近似值。根據(jù)圖像邊緣附近的光和影的強(qiáng)度,在超過一定數(shù)量的區(qū)域中的特定點(diǎn)被記錄為邊緣。Sobel算子認(rèn)為相鄰點(diǎn)之間的距離對當(dāng)前像素有不同的影響。距離越近,對當(dāng)前像素的影響越大,從而實(shí)現(xiàn)圖像的銳化和邊緣輪廓的高亮顯示。如圖6所示是使用Sobel算子進(jìn)行邊緣檢測的結(jié)果。
(5)輪廓檢測
以上操作說明了如何檢測圖像的邊緣并獲得圖像主邊緣的二值分布。邊緣勾勒出包含重要視覺信息的圖像元素。但簡單的二值邊緣分布有兩個(gè)主要缺點(diǎn):一是檢測到的邊緣太厚,增加了識(shí)別物體邊界的難度;更加重要的是,通常無法找到足夠低的閾值來檢測圖像中所有的重要邊緣和足夠高的閾值以避免太多不相關(guān)的邊緣。這是一個(gè)很難衡量的問題,但是可以利用Canny算法來解決這個(gè)問題。圖7是輪廓檢測的結(jié)果。
圖6 邊緣檢測效果圖 圖7 輪廓檢測結(jié)果
(6)頂點(diǎn)計(jì)算
進(jìn)行上述一系列處理之后,可以獲取圖像中物體的輪廓信息,通過對輪廓的邊緣進(jìn)行判斷和進(jìn)一步處理,確定輪廓的水平、垂直和對角這幾個(gè)方向的元素,保留這些方向的終點(diǎn)坐標(biāo),就能把這個(gè)矩形輪廓的位置描述清楚。然后對輪廓中的點(diǎn)排序,使它們顯示在左上、右上、右下和左下的順序中,然后繪制傾斜的邊界框的輪廓,最終可以通過計(jì)算頂點(diǎn)來實(shí)現(xiàn)對物體尺寸的測量。
3.測試結(jié)果及分析
利用系統(tǒng)測試得到的結(jié)果如圖7所示,檢測結(jié)果為長82.9mm,寬51.1mm,而校園卡實(shí)際長為85mm,寬為54mm。
表1 測量誤差分析表
根據(jù)本文提出的測量方法對校園卡進(jìn)行測量后,得出的測量結(jié)果基本上是正確的,但是存在著一定的誤差。在這里絕對誤差的值是測量值與真實(shí)值做差的絕對值,相對誤差是絕對誤差與真實(shí)值的比值。其誤差分析表如表1所示。
最后的實(shí)驗(yàn)結(jié)果表明,本文提出的方法存在其優(yōu)點(diǎn)和缺陷。具體來說,其優(yōu)點(diǎn)在于不需要參考物,既不需要先測量參考物的尺寸,也不需要將參考物和待測物體放在一起拍攝;存在的缺陷在于每次若使用不同的拍攝設(shè)備,都要先對拍攝設(shè)備的焦距進(jìn)行多次測量,另外,需要先固定拍攝距離,不同的拍攝距離有不同的成像效果。
本文提出的方法是針對靜態(tài)圖片中的目標(biāo)物體進(jìn)行尺寸測量,這些靜態(tài)圖片通過攝像頭拍攝的。該系統(tǒng)測量的對象主要是規(guī)則物體,并能根據(jù)物體的外觀輪闊尺寸計(jì)算出物體的面積和體積,其硬件部分是一個(gè)攝像頭和一臺(tái)計(jì)算機(jī);軟件部分包括四個(gè)大的模塊,分別是圖像采集、圖像預(yù)處理、識(shí)別與測量、結(jié)果輸出模塊。該方法減少了識(shí)別和計(jì)算過程中造成的不可避免的數(shù)據(jù)誤差,能最大程度上還原物體的真實(shí)三維尺寸信息。