賈余晉,蔡紅專,戴浩,邢世波
(西京學(xué)院理學(xué)院,陜西西安,710000)
ROS(Robot Operating System) 是 Willow Garage公司開發(fā)的一個(gè)適用于機(jī)器人的開源的元操作系統(tǒng)。ROS是一種目前廣泛使用的機(jī)器人操作與控制系統(tǒng)軟件框架,該框架使用了當(dāng)前最流行的面向服務(wù)(SOA)的軟件技術(shù),通過網(wǎng)絡(luò)協(xié)議將節(jié)點(diǎn)間數(shù)據(jù)通信解耦,這樣就能輕松地集成不同語言功能的代碼。同時(shí),簡(jiǎn)單快捷的消息傳遞方式也能使系統(tǒng)進(jìn)行有效的分布式控制。
本文以ROS作為開發(fā)環(huán)境,通過OpenCV庫(kù)對(duì)采集的圖像集進(jìn)行處理,并使用Python語言進(jìn)行編程,設(shè)計(jì)了一個(gè)運(yùn)動(dòng)物體跟蹤系統(tǒng),具有能夠?qū)崟r(shí)定位移動(dòng)物體的功能。該系統(tǒng)具有良好的穩(wěn)定性和抗干擾性,能夠快速準(zhǔn)確的識(shí)別到選定物體并能夠?qū)崟r(shí)判定選定物體的位置。
本文圖像采集使用的是外接USB攝像頭,利用usb_cam功能包將攝像頭采集的圖像轉(zhuǎn)換為ROS圖像,通過話題進(jìn)行發(fā)布,使其他各個(gè)節(jié)點(diǎn)能夠接收到圖像信息。當(dāng)節(jié)點(diǎn)接收到圖像數(shù)據(jù)后,可以使用OpenCV的接口功能包Cv_Bridge。Cv_Bridge不僅可以實(shí)現(xiàn)圖像在OpenCV格式與ROS格式之間的轉(zhuǎn)換,還可以通過調(diào)用OpenCV庫(kù)對(duì)圖像進(jìn)行各種處理。最后將處理后的數(shù)據(jù)發(fā)布話題,使其他節(jié)點(diǎn)接收到處理后的圖像數(shù)據(jù)。
圖1 Cv_Bridge和usb_cam功能包的作用
(1)安裝usb_cam功能包:
$sudo apt-get install ros-kinetic-usb-cam
(2)啟動(dòng)攝像頭:
$roslaunch usb_cam usb_cam-test.launch
圖2 usb_cam運(yùn)行計(jì)算圖
圖3 usb_cam運(yùn)行效果圖
在進(jìn)行運(yùn)動(dòng)物體跟蹤時(shí),首先要將采集到的彩色圖像進(jìn)行灰度化處理,這是因?yàn)楹诎渍掌瑪?shù)據(jù)量小,更容易提取圖像中的特征點(diǎn),在算法實(shí)現(xiàn)時(shí)能減少運(yùn)算量[1]。對(duì)RGB圖像進(jìn)行灰度化,實(shí)際上就是對(duì)圖像RGB三個(gè)分量進(jìn)行加權(quán)平均得到最終的灰度值,其公式為:
灰度化處理后,對(duì)跟蹤目標(biāo)物體進(jìn)行斑點(diǎn)特征提取。斑點(diǎn)通常是指與周圍有著顏色和灰度差別的區(qū)域,它比角點(diǎn)特征更加穩(wěn)定,同時(shí)也具有更好的抗噪能力,更適用于運(yùn)動(dòng)物體跟蹤系統(tǒng)。斑點(diǎn)特征提取使用的是SURF算法,該算法使用了基于Hessian行列式(DoH)的近似Harr小波方法來提取斑點(diǎn)特征[2]。這種方法的主要目的是使二階微分模板的構(gòu)建構(gòu)建更加簡(jiǎn)單,同時(shí)提高尺度空間上的檢測(cè)效率,從不同尺度上的積分圖像計(jì)算出近似Harr小波值可以滿足這種要求。通過上述方法對(duì)每個(gè)尺度上的每個(gè)像素點(diǎn)進(jìn)行檢測(cè),構(gòu)建出的Hessian矩陣及其行列式的值分別為:
Dxx,Dxy和Dyy是盒子濾波器得到的近似卷積值。當(dāng)c(x,y,σ) 的值超過了設(shè)置的門限值,則該像素點(diǎn)為關(guān)鍵點(diǎn),反之則為不相關(guān)點(diǎn)[3]。得到關(guān)鍵點(diǎn)后,對(duì)其3×3×3范圍內(nèi)的像素鄰域進(jìn)行非極大值抑制,最后再對(duì)斑點(diǎn)特征進(jìn)行插值運(yùn)算,就可以得到特征點(diǎn)的精準(zhǔn)定位了。
本次物體跟蹤系統(tǒng)設(shè)計(jì)基于外接USB攝像頭實(shí)現(xiàn),本次系統(tǒng)設(shè)計(jì)算法流程圖如圖4所示。
圖4 運(yùn)動(dòng)物體跟蹤系統(tǒng)流程
首先使用Cv_Bridge將USB攝像頭采集到的ROS圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式,然后創(chuàng)建灰度圖像并提取圖像中的斑點(diǎn)特征。提取完特征點(diǎn)后,對(duì)前后兩幀圖像進(jìn)行灰度值對(duì)比,估計(jì)出當(dāng)前幀中跟蹤物體的特征點(diǎn)在下一幀圖像中的位置,過濾掉兩幀圖片中無變化的特征點(diǎn),余下的點(diǎn)就是跟蹤物體在第二幀圖像中的特征點(diǎn),特征點(diǎn)聚集的位置就是跟蹤物體的位置。最后檢測(cè)移動(dòng)物體的區(qū)域,如果檢測(cè)到的區(qū)域小于設(shè)置值,則忽略;如果檢測(cè)到的區(qū)域在設(shè)置值內(nèi),則在畫面上框出識(shí)別到的物體,并在畫面上標(biāo)出當(dāng)前狀態(tài)和時(shí)間戳信息[4]。
框選移動(dòng)物體使用的是CamShift算法,可以在跟蹤的過程中隨著目標(biāo)的變化實(shí)時(shí)調(diào)整搜索窗口大小。對(duì)于圖像序列中的每一幀還是采用MeanShift來尋找最優(yōu)迭代結(jié)果,并通過對(duì)算法中零階矩的判斷實(shí)現(xiàn)自動(dòng)調(diào)整窗口大小。在算法中尋找搜索窗口的質(zhì)心用到窗口的零階矩M00和一階矩M10,M01:
零階矩是搜索窗口內(nèi)所有像素的積分,即所有像素值之和,物理上的意義是計(jì)算搜索窗口的尺寸。經(jīng)過目標(biāo)的H分量直方圖反向投影后,目標(biāo)區(qū)域的搜索窗口大部分像素值歸一化后應(yīng)該是最大值255,如果計(jì)算出來零階矩大于某一閾值,可以認(rèn)為此時(shí)目標(biāo)鋪滿了整個(gè)搜索窗口[5]。有理由認(rèn)為在搜索窗口之外的區(qū)域還存在目標(biāo)區(qū)域,需要增大搜索窗口的尺寸;反之,當(dāng)零矩陣比某一閾值小的時(shí)候,搜索窗口的尺寸將會(huì)變小。這樣的話,無論目標(biāo)在鏡頭中的大小如何變化,CamShift算法都可以自適應(yīng)的調(diào)整目標(biāo)區(qū)域進(jìn)行跟蹤。
在ROS環(huán)境下建立robot_vision功能包,在功能包script文件中建立motiong_detector.py文件,再在laun ch文件夾中建立motion_detector.launch文件。最后在三個(gè)不同終端中運(yùn)行以下指令:
$roslaunch robot_vision usb_cam.launch
$roslaunch robot_vision motion_detector.launch
$rqt_image_view
即可運(yùn)行物體跟蹤系統(tǒng),在畫面中移動(dòng)識(shí)別物體,即可看到矩形框標(biāo)識(shí)出了運(yùn)動(dòng)物體的實(shí)時(shí)位置,效果如圖5所示。
圖5 物體跟蹤的運(yùn)行效果
隨著社會(huì)的發(fā)展,機(jī)器視覺已經(jīng)融入到了生活的各個(gè)角落中,人們的生活更加便利、身處的環(huán)境也更加智能。同時(shí),機(jī)器視覺的發(fā)展為其他行業(yè)提供了諸多可能性,比如在當(dāng)下十分流行的自動(dòng)駕駛研究領(lǐng)域中,可以通過運(yùn)動(dòng)物體跟蹤識(shí)別來識(shí)別公路上的地線,讓自動(dòng)駕駛汽車接收到更豐富、更有價(jià)值的傳感器信息;在工業(yè)生產(chǎn)中,運(yùn)動(dòng)物體跟蹤識(shí)別也能讓工業(yè)機(jī)械臂更加精準(zhǔn)的定位產(chǎn)品位置,使其工作更加穩(wěn)定高效。運(yùn)動(dòng)物體跟蹤識(shí)別作為機(jī)器視覺的其中一環(huán),它的成熟發(fā)展也為更復(fù)雜的機(jī)器視覺應(yīng)用研究提供了思路。