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