趙 霞, 陸小龍, 廖 明
(1.四川大學(xué)制造科學(xué)與工程學(xué)院,四川 成都 610065;2.四川航天計(jì)量測(cè)試研究所,四川 成都 610100)
鐵塔攀爬機(jī)器人的爪子使用的是電磁鐵,因此在攀爬鐵塔的過(guò)程中如何使爪子準(zhǔn)確無(wú)誤的吸附到角鐵上是機(jī)器人是否可以順利進(jìn)行攀爬的關(guān)鍵性因素。在機(jī)器人兩爪部,圓形電磁鐵的外側(cè)各安裝了一個(gè)USB攝像頭。攝像頭的對(duì)稱(chēng)軸與電磁鐵爪子的對(duì)稱(chēng)軸平行,所以只要拍攝到的角鐵兩邊緣的中線(xiàn)與攝像頭視場(chǎng)的中線(xiàn)相重合,就說(shuō)明爪子已經(jīng)與角鐵的位置對(duì)正,可以進(jìn)行吸附。這里采用了Sobel算子進(jìn)行邊緣檢測(cè),以O(shè)penCV為平臺(tái),在VB.net環(huán)境中進(jìn)行了編程,成功提取了角鐵的邊緣和中線(xiàn),驗(yàn)證了算法的有效性。
OpenCV(Intel Open Source Computer Vision Library)是由Intel公司1999年研制開(kāi)發(fā)的開(kāi)源計(jì)算機(jī)視覺(jué)函數(shù)庫(kù),擁有包括300多個(gè)C函數(shù)的跨平臺(tái)中、高層API。使用時(shí)可以大大減少開(kāi)發(fā)者的編程工作量,具備強(qiáng)大的圖像和矩陣運(yùn)算能力,方便靈活的用戶(hù)接口,主要用于對(duì)圖像進(jìn)行一些高級(jí)處理,比如說(shuō)特征檢測(cè)與跟蹤、運(yùn)動(dòng)分析、目標(biāo)分割與識(shí)別以及3D重建等,同時(shí)支持Windows、Linux平臺(tái),也可以移植到嵌入式開(kāi)發(fā)平臺(tái)。且OpenCV不依賴(lài)于外部庫(kù),對(duì)于商業(yè)和非商業(yè)的用戶(hù)都是免費(fèi)的。
OpenCV相比Matlab的圖像庫(kù),最大優(yōu)點(diǎn)是速度比較快,具有較高的實(shí)時(shí)操作性。它的底層是C和C++編寫(xiě)的,有一定的靈活性,能和許多編譯器結(jié)合使用,所以它的應(yīng)用越來(lái)越多。在經(jīng)歷了Matlab圖像處理運(yùn)算的慢速度之后,很多情況下都可以使用OpenCV,這樣會(huì)更有效率,為數(shù)字圖像處理提供了極大的方便,具有了更廣闊的應(yīng)用前景。
許多對(duì)OpenCV的使用介紹都是基于VC++或者C,其實(shí)OpenCV同樣可以在.net框架下使用。下面簡(jiǎn)單介紹OpenCV在VB.net中如何使用。
首先,下載并安裝Visual Studio 2005和OpenCV的同時(shí)下載解壓壓縮包Emgu.CV.Binary-1.5.0.1。EmguCV封裝了OpenCV image processing library,透過(guò)EmguCV,就可以在VS2005中使用OpenCV;其次,將Emgu.CV.Binary-1.5.0.1文件夾中的Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Dmgu.Util.dll、ZedGraph.dll和Zlib.net.dll六個(gè)動(dòng)態(tài)鏈接庫(kù)加入到資源解決方案的引用中;最后,將EmguCV的控制項(xiàng)加載到工具箱中。進(jìn)入菜單,工具->選擇工具箱項(xiàng)目->.net Framework元件->瀏覽,進(jìn)入Emgu.CV.Binary-1.5.0.1文件夾,選擇Emgu.CV.UI.dll。之后工具箱中會(huì)出現(xiàn)ImageBox、HistogramCtrl兩個(gè)選項(xiàng)。
經(jīng)過(guò)以上三個(gè)步驟,就已經(jīng)完成了將OpenCV嵌入到.net框架中去,接下來(lái)就可以利用OpenCV中的函數(shù)在VB.net中編寫(xiě)代碼進(jìn)行圖像處理的工作了。
所謂邊緣是指其周?chē)袼鼗叶扔刑S變化的那些像素的集合。邊緣廣泛存在于物體與背景之間、物體與物體之間、基元與基元之間。因此它是圖像分割所依賴(lài)的重要特征[1]。該文需要檢測(cè)的就是物體與背景之間的邊緣,也就是角鋼與背景之間的邊緣,將角鋼與背景分離開(kāi)來(lái)。
OpenCV中用于邊緣檢測(cè)的函數(shù)有兩個(gè),Sobel函數(shù)和Canny函數(shù)。Sobel算子屬于梯度算子[2],且結(jié)合了Gaussian平滑微分,所以其結(jié)果或多或少對(duì)噪聲有一定的魯棒性[3]。Canny算法使用了拉普拉斯算子,該方法與其他邊緣檢測(cè)方法的不同之處在于:它使用兩種不同的閾值分別檢測(cè)強(qiáng)邊緣和弱邊緣,并且僅當(dāng)弱邊緣與強(qiáng)邊緣相連時(shí)才將弱邊緣包含在輸出圖像中。因此這種方法較其他方法而言不容易被噪聲“填充”,更容易檢查出真正的弱邊緣[2]。圖1是即將被檢測(cè)的灰度圖像。經(jīng)實(shí)驗(yàn)對(duì)比兩種算法,如圖2和圖3所示。
由圖2和圖3可以看出,雖然用OpenCV中的Sobel函數(shù)進(jìn)行的邊緣檢測(cè)得到的不是二進(jìn)制圖像,但檢測(cè)的結(jié)果是檢測(cè)所需要的角鐵的兩條邊緣,很清晰地與背景分離開(kāi)來(lái)了。而Canny算法因?yàn)槠錂z測(cè)的完整性實(shí)現(xiàn)而把角鐵表面和背景上的一些不需要的雜散點(diǎn)也檢測(cè)了出來(lái),這些雜散點(diǎn)影響了后續(xù)的兩邊緣中線(xiàn)的檢測(cè)。因此選用Sobel函數(shù)做為邊緣檢測(cè)的函數(shù)。
但是OpenCV中的Sobel函數(shù)進(jìn)行邊緣檢測(cè)之后的效果是灰度圖像,需要對(duì)其進(jìn)行二值化。由于角鐵特殊的結(jié)構(gòu),造成對(duì)其用Sobel函數(shù)進(jìn)行邊緣提取以后,兩條邊緣一個(gè)黑一個(gè)白。為了使二值化之后兩條邊緣全部保留,在進(jìn)行二值化之前先將黑色的邊緣轉(zhuǎn)換成白色,再對(duì)整幅圖進(jìn)行二值化。轉(zhuǎn)換之后的結(jié)果如圖4所示。
經(jīng)過(guò)以上的邊緣提取之后,就要進(jìn)行提取中線(xiàn)。提取中線(xiàn)采取的方法是:
(1)取點(diǎn)的條件。一行中,可以取到兩個(gè)點(diǎn),并且這兩個(gè)點(diǎn)的間隔要大于某個(gè)值。為了提高速度,不遍歷圖像所有點(diǎn),而是從圖像上半部開(kāi)始符合條件的一行取左側(cè)邊緣上的一點(diǎn),間隔一定的距離后在同一行右側(cè)邊緣上取一點(diǎn),算出兩點(diǎn)的中點(diǎn)的坐標(biāo)值。
(2)用同樣的方法在圖像的下半部的左右兩邊緣分別取兩個(gè)點(diǎn),算出這兩個(gè)點(diǎn)的中點(diǎn)的坐標(biāo)值。
(3)連接兩個(gè)中點(diǎn),即得出兩邊緣的中線(xiàn)。畫(huà)出中線(xiàn),如圖5所示。
(4)計(jì)算該中線(xiàn)與y方向的夾角度數(shù),由此可以給控制爪子的電機(jī)發(fā)出指令,使其轉(zhuǎn)動(dòng)相應(yīng)的度數(shù),從而使爪子與角鐵位置對(duì)正。
在實(shí)驗(yàn)中機(jī)器人攀爬過(guò)程中采集到的圖像如圖6所示,經(jīng)過(guò)邊緣檢測(cè)過(guò)后如圖7所示,仍然有很多雜散點(diǎn)存在,但是這并不影響角鐵中線(xiàn)的提取的結(jié)果,該算法可以避開(kāi)雜散點(diǎn)實(shí)現(xiàn)中線(xiàn)的檢測(cè)。
由圖6和圖7可知,角鐵的區(qū)域在視場(chǎng)內(nèi)占的范圍很大,很有可能在檢測(cè)的過(guò)程中視場(chǎng)中只出現(xiàn)一條邊緣,這樣就必須對(duì)攝像頭進(jìn)行標(biāo)定,才能在出現(xiàn)一條邊緣的情況下正確的判斷出角鐵的中線(xiàn)。
標(biāo)定分 2 種方法[3]:(1)經(jīng)典的標(biāo)定方法;(2)自標(biāo)定方法。經(jīng)典的標(biāo)定方法是在一定的攝像機(jī)模型下,基于特定的條件例如形狀尺寸己知的標(biāo)定物,經(jīng)過(guò)圖像處理的手段,利用一系列數(shù)學(xué)變換和計(jì)算方法,求取攝像機(jī)模型的內(nèi)部參數(shù)和外部參數(shù)。這里采用一個(gè)簡(jiǎn)單的方法進(jìn)行標(biāo)定。在爪子吸附在角鐵上的時(shí)候,攝像頭離角鐵的距離是一定,角鐵的寬度是一定的,只要保持?jǐn)z像頭的焦距,也就是參數(shù)不變,那么在視場(chǎng)中顯示出的角鐵的寬度所占的像素值也是不變的。
當(dāng)檢測(cè)出只有一條邊緣時(shí),先利用未進(jìn)行邊緣檢測(cè)的灰度圖判斷沒(méi)有檢測(cè)出的那條邊緣在已檢測(cè)邊緣的哪一側(cè)。取圖像左上角的第一點(diǎn)灰度值,如果灰度值在角鐵的灰度值范圍內(nèi),表明未檢測(cè)出的邊緣在已知邊緣的左側(cè),反之,未檢測(cè)出的邊緣就在已知邊緣的右側(cè)。再計(jì)算已檢測(cè)出的邊緣的斜率,之后就可以根據(jù)已知的角鐵寬度像素值找出角鐵的中線(xiàn)。結(jié)果如圖8~圖11所示。
通過(guò)對(duì)圖像處理和OpenCV開(kāi)源軟件包以及VB.net的研究,合理編寫(xiě)了角鐵邊緣檢測(cè)和中線(xiàn)提取的算法,并在實(shí)驗(yàn)中驗(yàn)證了算法的合理和有效性,基本實(shí)現(xiàn)了功能。但是還存在一些問(wèn)題,例如,算法的實(shí)時(shí)性不好,速度還不夠快,還需要今后的進(jìn)一步優(yōu)化。
[1] 周 婷.基于OpenCV的移動(dòng)靶面圖像識(shí)別算法研究[D].大連:大連海事大學(xué),2008.
[2] 徐 飛,施曉紅.MATLAB應(yīng)用圖像處理[M].西安:西安電子科技大學(xué)出版社,2002.
[3] 陳小天.攝像機(jī)標(biāo)定技術(shù)[D].長(zhǎng)沙:國(guó)防科技大學(xué),2003.
[4]Bradski G,Kaehler A.Learning OpenCV[M].The United States of America:O’Reilly Media,Inc.,2008.
[5]Sonka M,Hlavac V,Boyle R.圖像處理與機(jī)器視覺(jué)[M].北京:人民郵電出版社,2009.
[6] 孫 穎,慶 生,陳 靜.一種基于OpenCV的飛機(jī)跑道及地平線(xiàn)檢測(cè)算法[J].智能交通,2009(3):190-191.
[7] 李振華.基于CMOS的視頻采集及邊緣檢測(cè)系統(tǒng)的研究[D].武漢:武漢理工大學(xué),2007.
[8] 吳曉陽(yáng).基于OpenCV的運(yùn)動(dòng)目標(biāo)檢測(cè)與跟蹤[D].杭州:浙江大學(xué),2008.
[9] 孫觀宏,劉 江,李忠濤,等.基于OpenCV的圖像采集及激光線(xiàn)形提取程序的開(kāi)發(fā)方式 [J].機(jī)械制造與研究,2008,37(2):53-55.
[10]連 靜.圖像邊緣特征提取算法研究及應(yīng)用 [D].長(zhǎng)春:吉林大學(xué),2008.