賈余晉,蔡紅專,戴浩,邢世波
(西京學院理學院,陜西西安,710000)
ROS(Robot Operating System) 是 Willow Garage公司開發的一個適用于機器人的開源的元操作系統。ROS是一種目前廣泛使用的機器人操作與控制系統軟件框架,該框架使用了當前最流行的面向服務(SOA)的軟件技術,通過網絡協議將節點間數據通信解耦,這樣就能輕松地集成不同語言功能的代碼。同時,簡單快捷的消息傳遞方式也能使系統進行有效的分布式控制。
本文以ROS作為開發環境,通過OpenCV庫對采集的圖像集進行處理,并使用Python語言進行編程,設計了一個運動物體跟蹤系統,具有能夠實時定位移動物體的功能。該系統具有良好的穩定性和抗干擾性,能夠快速準確的識別到選定物體并能夠實時判定選定物體的位置。
本文圖像采集使用的是外接USB攝像頭,利用usb_cam功能包將攝像頭采集的圖像轉換為ROS圖像,通過話題進行發布,使其他各個節點能夠接收到圖像信息。當節點接收到圖像數據后,可以使用OpenCV的接口功能包Cv_Bridge。Cv_Bridge不僅可以實現圖像在OpenCV格式與ROS格式之間的轉換,還可以通過調用OpenCV庫對圖像進行各種處理。最后將處理后的數據發布話題,使其他節點接收到處理后的圖像數據。

圖1 Cv_Bridge和usb_cam功能包的作用
(1)安裝usb_cam功能包:
$sudo apt-get install ros-kinetic-usb-cam
(2)啟動攝像頭:
$roslaunch usb_cam usb_cam-test.launch

圖2 usb_cam運行計算圖

圖3 usb_cam運行效果圖
在進行運動物體跟蹤時,首先要將采集到的彩色圖像進行灰度化處理,這是因為黑白照片數據量小,更容易提取圖像中的特征點,在算法實現時能減少運算量[1]。對RGB圖像進行灰度化,實際上就是對圖像RGB三個分量進行加權平均得到最終的灰度值,其公式為:

灰度化處理后,對跟蹤目標物體進行斑點特征提取。斑點通常是指與周圍有著顏色和灰度差別的區域,它比角點特征更加穩定,同時也具有更好的抗噪能力,更適用于運動物體跟蹤系統。斑點特征提取使用的是SURF算法,該算法使用了基于Hessian行列式(DoH)的近似Harr小波方法來提取斑點特征[2]。這種方法的主要目的是使二階微分模板的構建構建更加簡單,同時提高尺度空間上的檢測效率,從不同尺度上的積分圖像計算出近似Harr小波值可以滿足這種要求。通過上述方法對每個尺度上的每個像素點進行檢測,構建出的Hessian矩陣及其行列式的值分別為:

Dxx,Dxy和Dyy是盒子濾波器得到的近似卷積值。當c(x,y,σ) 的值超過了設置的門限值,則該像素點為關鍵點,反之則為不相關點[3]。得到關鍵點后,對其3×3×3范圍內的像素鄰域進行非極大值抑制,最后再對斑點特征進行插值運算,就可以得到特征點的精準定位了。
本次物體跟蹤系統設計基于外接USB攝像頭實現,本次系統設計算法流程圖如圖4所示。

圖4 運動物體跟蹤系統流程
首先使用Cv_Bridge將USB攝像頭采集到的ROS圖像數據轉換成OpenCV的圖像格式,然后創建灰度圖像并提取圖像中的斑點特征。提取完特征點后,對前后兩幀圖像進行灰度值對比,估計出當前幀中跟蹤物體的特征點在下一幀圖像中的位置,過濾掉兩幀圖片中無變化的特征點,余下的點就是跟蹤物體在第二幀圖像中的特征點,特征點聚集的位置就是跟蹤物體的位置。最后檢測移動物體的區域,如果檢測到的區域小于設置值,則忽略;如果檢測到的區域在設置值內,則在畫面上框出識別到的物體,并在畫面上標出當前狀態和時間戳信息[4]。
框選移動物體使用的是CamShift算法,可以在跟蹤的過程中隨著目標的變化實時調整搜索窗口大小。對于圖像序列中的每一幀還是采用MeanShift來尋找最優迭代結果,并通過對算法中零階矩的判斷實現自動調整窗口大小。在算法中尋找搜索窗口的質心用到窗口的零階矩M00和一階矩M10,M01:


零階矩是搜索窗口內所有像素的積分,即所有像素值之和,物理上的意義是計算搜索窗口的尺寸。經過目標的H分量直方圖反向投影后,目標區域的搜索窗口大部分像素值歸一化后應該是最大值255,如果計算出來零階矩大于某一閾值,可以認為此時目標鋪滿了整個搜索窗口[5]。有理由認為在搜索窗口之外的區域還存在目標區域,需要增大搜索窗口的尺寸;反之,當零矩陣比某一閾值小的時候,搜索窗口的尺寸將會變小。這樣的話,無論目標在鏡頭中的大小如何變化,CamShift算法都可以自適應的調整目標區域進行跟蹤。
在ROS環境下建立robot_vision功能包,在功能包script文件中建立motiong_detector.py文件,再在laun ch文件夾中建立motion_detector.launch文件。最后在三個不同終端中運行以下指令:
$roslaunch robot_vision usb_cam.launch
$roslaunch robot_vision motion_detector.launch
$rqt_image_view
即可運行物體跟蹤系統,在畫面中移動識別物體,即可看到矩形框標識出了運動物體的實時位置,效果如圖5所示。

圖5 物體跟蹤的運行效果
隨著社會的發展,機器視覺已經融入到了生活的各個角落中,人們的生活更加便利、身處的環境也更加智能。同時,機器視覺的發展為其他行業提供了諸多可能性,比如在當下十分流行的自動駕駛研究領域中,可以通過運動物體跟蹤識別來識別公路上的地線,讓自動駕駛汽車接收到更豐富、更有價值的傳感器信息;在工業生產中,運動物體跟蹤識別也能讓工業機械臂更加精準的定位產品位置,使其工作更加穩定高效。運動物體跟蹤識別作為機器視覺的其中一環,它的成熟發展也為更復雜的機器視覺應用研究提供了思路。