蔡志兆,呂建勛
北京航空航天大學自動化科學與電氣工程學院,北京100191
運動檢測技術是計算機視覺領域重要的技術之一,在自動導航、智能車輛等方面都有很好的應用[1]。隨著軟硬件技術,特別是各類圖像傳感器技術的發展,進一步促進了物體的運動檢測技術的研究。Liu等[2]利用Kinect獲取人體深度信息,利用深度信息計算人體的位置信息,實現ATM機前的人體異常檢測,包括臉部遮擋、偷窺他人信息、長時間逗留等。Parra-Dominguez等[3]利用Kinect獲取人的行為信息,使用監督學習進行訓練,能夠檢測人體上樓跌倒的異常行為。與傳統的僅使用彩色信息的方法相比,運動檢測加上深度信息很大程度上提升了檢測的準確率。
本文建立了基于Kinect的運動檢測平臺,檢測物體的運動信息。為了提高運動檢測的準確性,加入深度信息進行邊界判斷。基于物體邊界信息計算單應性矩陣,從而進行物體的運動檢測。本文首先介紹了基于Kinect的運動檢測平臺的搭建,對各個功能模塊進行了敘述;然后提出了基于單應性矩陣的物體運動檢測算法;最后基于Kinect采集的圖像數據進行檢測算法的驗證。
本實驗平臺采用Kinect2進行圖像數據的采集,Kinect2通過紅外線脈沖反射回來的時間來獲得深度信息(物體到傳感器的距離)。Kinect2性能較Kinect1有很大提升,且圖像分辨率有所提高,有更好的視覺效果,檢測范圍也更廣。Kinect2外觀圖如圖1所示。

圖1 Kinect2外觀
1.1.1 圖像數據獲取
獲取Kinect2數據源的流程如下:Sensor->Reader->Frame->Data。
Kinect數據模式有以下幾種:
1)Source。Kinect上的各個傳感器,給了每個傳感器源的入口。
2)Reader。有了Reader就可以訪問各個傳感器上的數據幀,一個傳感器源上可有多個Reader。
3)Frame References。幀引用,通過它訪問幀本身,可以用AcquireFrame獲取此引用所持有的幀。
4)Frame。幀本身,有了Frame就可以訪問實際數據并進行處理,即可以得到數據。
1.1.2 圖像數據
對Kinect2采集的各種圖像格式進行分析。
1)彩色圖像:Kinect2采集的彩色圖像分辨率是1920×1080,采樣率為30f/s[4],采集到的圖像有多種格式,如Rgba、Yuv等,本文采用RGB格式;
2)深度圖像:Kinect2采集到的深度圖是單通道的,每個通道存儲16bit的深度值,以mm為單位,在程序編寫時需要注意單位轉換。測量的深度值范圍在0.5~4.5m。
由于本文需要對大量的圖像數據進行實時采集和處理,如果只是調用相應的函數對數據進行保存和記錄,會增加圖像讀取線程的負擔;同時如果想要記錄時間、傳感器的數據等,需要調用多個函數來實現,既繁瑣又耗時。ROS提供了一系列的庫和工具,可以有效幫助開發人員實現這些功能。
1.2.1 ROS系統介紹
ROS安裝是在Ubuntu操作系統上進行的,Ubuntu是Linux系統的一個變形,通過終端命令進行操作,同時具有圖形化的操作工具。
ROS提供了消息的傳輸和軟件包管理等許多功能,它遵循BSD開源許可協議。ROS被稱為一個進程管理的操作系統,每個進程在ROS上都是一個節點,它通過發布節點進行通信。我們可以根據節點看到進程之間的通信[5]。
1.2.2 ROS驅動流程
本檢測平臺使用ROS驅動Kinect進行圖像數據的采集和保存。流程如下:
1)roscore運行一個節點管理器master;
2)roslaunch將多個rosnode結合起來,一起運行,其文件是使用XML語言來描述節點以及相關參數的設置和軟件的啟動的,通過roslaunch運行Kinect2_bridge.launch,運行多個節點;
3)rosrun運行節點執行viewer.cpp程序,驅動相機進行圖像數據采集,通過修改viewer.cpp程序,添加控制命令,以一定的采樣率控制圖像采集的開始和停止。
ROS驅動Kinect采集的示意圖如圖2所示。

圖2 彩色?深度圖像
本文的研究內容涉及到對圖像數據進行預處理和可視化等。這部分內容主要是基于OpenCV開源庫進行的。下面對OpenCV的環境搭建做介紹。
1)OpenCV介紹
OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Mac OS等操作系統上,實現了圖像處理和計算機視覺方面的很多通用算法[6]。目前很多新的開發和算法都是用C++接口,本平臺采用C++編程語言來實驗運動檢測算法。
2)OpenCV安裝
1.2節介紹了ROS驅動相機進行圖像數據采集的相關內容。在Ubuntu基礎上安裝了ROS,OpenCV也是基于Ubuntu進行安裝。在使用cmake編譯程序形成可執行文件時,首先需要編寫CMakeLists文件定義相關的包和頭文件路徑等。由于ROS的安裝帶有OpenCV3的相關模塊,若需要使用OpenCV2相關功能的模塊,且CMakeLists文件不指定尋找的OpenCV的包的版本,則默認尋找OpenCV3。由于OpenCV2和OpenCV3的版本差異,有些模塊做了修改,所以需要根據實際要求在CMakeLists里用FIND_PACKAGE()指定OpenCV版本。
對于物體的運動檢測,主要分為邊界檢測、特征點檢測、單應性矩陣計算、運動檢測4個部分。本章旨在討論運動檢測的關鍵技術,基于已有的算法進行改進,討論算法的有效性和可靠性。
邊界是圖像的一個重要的特征,對圖像的處理經常需要用到邊界信息。在光流場的計算中,對邊界檢測的準確性直接決定了運動信息檢測的精度。
2.1.1 Canny邊界檢測
Canny是目前使用最多的邊界檢測算子,相比較其他邊界檢測算子,適用于更多的場景,是目前最優的邊界檢測算法,Canny邊界檢測可以分為以下幾個部分[7]:
1)高斯去噪:一般的原始圖像都會含有很大的噪聲,所以在圖像處理之前需要進行去噪處理,特別是邊界檢測,在含有噪聲的原圖上進行邊界檢測效果都不會很好。Canny算子加入了高斯核對原圖進行卷積,去除單個像素點噪聲的影響。
2)非極大值抑制:Canny算子的非極大值抑制原理是搜索像素點P(i,j)梯度方向上8領域內最大梯度幅值點,保留最大幅值像素點,抑制掉非極大值點。
3)滯后閾值:滯后閾值需要2個閾值,一個高閾值,一個低閾值。Canny算子使用2個閾值分別來控制邊界的選擇和連通性。
2.1.2 基于深度信息的邊界檢測
Canny邊界檢測算法能夠很好地檢測到物體的邊界,如圖3所示。檢測結果表明,其不僅能夠檢測到目標物體的邊界信息,對于背景的邊界信息也能檢測出來。

圖3 Canny邊界檢測效果
在實際的運動檢測中,我們所需要關注的對象是目標物體,對于背景的邊界并不關心。基于此,在Canny邊界檢測算法的基礎上,加上深度信息進行邊界判斷。如果該邊界與目標物體不在同一深度位置則表明此邊界不是目標物體上的邊界。檢測結果如圖4所示,加上深度信息進行判斷,去除了多余的邊界信息,簡化了邊界,提取目標物體整體輪廓。

圖4 基于深度信息的邊界檢測效果
運動檢測的第二步即為特征點檢測,圖像特征點能夠反映圖像本質特征,能夠標識圖像中目標物體。圖像特征點在基于特征點的圖像匹配算法中有著十分重要的作用。同時特征點檢測的結果決定了單應性矩陣的計算優劣。
2.2.1 Harris特征點檢測
角點是圖像的一大特征點,其表現為輪廓之間的交點,該點附近的像素點無論在梯度幅值還是梯度方向上都有著較大變化。角點對于小孔徑的視野,具有很穩定的特性。
Harris角點檢測[8]的原理是使用一個滑動窗口,沿著不同方向對像素值進行卷積,比較窗口滑動前與滑動后窗口內像素值的變化,若不論哪個方向都有著很大的灰度值變化,則此點定義為角點。
檢測效果如圖5、6所示,由圖5和圖6可知,Harris角點檢測具有比較好的特征點檢測的效果,但此算法針對的是整個場景,檢測出來的目標物體以外的特征點需要去除。

圖5 物體1特征點檢測效果

圖6 物體2特征點檢測效果
2.2.2 基于邊界信息的特征點檢測
基于之前的內容,已經研究了目標物體的邊界檢測。本文研究的目的是檢測物體的運動信息,對于目標物體以外的特征點我們并不關心。為了去除邊界外的特征點,利用目標物體的邊界信息進行特征點提取,判斷各特征點與邊界的關系:在邊界內、在邊界上、在邊界外。提取邊界內和邊界上的特征點進行下面的特征點匹配和單應性矩陣的計算。
去除目標物體邊界外的特征點的檢測結果如圖7、8所示,由圖7、8可以知道,加上目標物體的邊界信息能夠很好地去除邊界外的特征點,留下目標物體內的有效特征點,特征點具有一定分散性,能夠一定程度上代表目標物體。

圖7 物體1基于邊界的特征點檢測效果

圖8 物體2基于邊界的特征點檢測效果
在計算機視覺中,平面的單應性被定義為一個平面到另外一個平面的投影映射。對于特征點匹配和計算單應性矩陣算法的設計,采用LK[9]光流法進行運動物體匹配點計算,基于匹配點進行單應性矩陣的計算,有2種方法可進行單應性矩陣的計算。
2.3.1 基于圖像的單應性矩陣計算
針對全部場景(整幅圖像)進行單應性矩陣的計算,設定閾值,去除誤差值超過閾值的特征點。如圖9所示,淺色和深色圓點代表被檢測到的特征點,其中淺色的特征點為第一幀圖片的特征點,深色的特征點為第二幀圖像的特征點。通過融合前后2幀圖像,將前后2幀圖像的特征點融合在一起,圖片中的箭頭顯示第1幀和第2幀對應匹配特征點的運動方向。

圖9 基于圖像的特征點集匹配
基于圖像的單應性矩陣計算流程如下:
1)Harris算法檢測第一幀圖片特征點集points1;
2)LK算法計算第1幀圖片到第2幀圖片的匹配點集points2;
3)LK算法計算points2在第1幀圖片的匹配點集points3;
4)計算每對匹配點的距離值d[i]=|point3[i]?points1[i]|,設定閾值Tth,如果d[i]>Tth,則舍棄第i個特征點points1[i];如果d[i] 5)計算最優特征點集points4在第2幀圖片的匹配點集points5; 6)利用最優匹配點集points4和points5計算第1幀圖像和第2幀圖像之間的單應性矩陣。 2.3.2 基于目標物體的單應性矩陣計算 為了提高精確度,需要剔除目標物體以外的特征點,進行單應性矩陣的計算。如圖10所示,與圖9相似,淺色與深色的特征點分別代表第1幀和第2幀的特征點,箭頭代表運動方向,去除了目標物體以外的匹配點。 圖10 基于目標物體的特征點集匹配 基于目標物體的單應性矩陣計算流程如下: 1)Harris算法檢測第一幀圖片特征點集points1; 2)基于邊界檢測去除目標物體以外的特征點,保留目標物體上的特征點集point2; 3)與基于圖像的單應性矩陣計算流程步驟2)~6)類似。 由于圖像除目標物體外會有其他的背景,對于其他材質和形狀的物體單應性矩陣的計算可能會不同。相比較基于整幅圖像的單應性矩陣的計算,基于目標物體的單應性矩陣計算加入了邊界信息,去除了邊界外的特征點,對滿足閾值內的特征點進行保留,計算第1幀和第2幀圖像之間的單應性矩陣。此方法準確性更高。 二維圖像的運動可以表現為像素點的運動,像素點的運動形成光流場,通過估計光流場即可得到物體的運動信息,進而對物體進行運動檢測。本課題的研究對象是剛體,而剛體沒有形變,對小運動的相鄰幀圖片,可以用光流場代表其運動場。 前文已經討論了物體的邊界檢測和特征點檢測,計算了相鄰幀圖像之間的單應性矩陣,為了對物體進行運動檢測,還需要進行光流估計。 設計算的單應性矩陣為H,檢測的第1幀特征點集為C1,估計的第2幀圖像對應的匹配點集為C2,則有: 設p1(x1,y1)為第1幀圖像上檢測到的特征點,p2(x2,y2)為由式(1)計算出來的匹配點,設2點運動為(?u, ?v),有 ?u=x2?x1, ?v=y2?y1,要計算光流場即計算第1幀圖像每一幀檢測出的特征點與對應第2幀匹配點的差值[10]。整體光流計算公式為: 3.1.1 稀疏光流結果可視化 稀疏光流計算即提取目標物體的特征點進行光流場計算,可視化結果如圖11、12所示。目標物體均往圖像左邊運動,運動檢測結果顯示箭頭指向左邊,箭頭越長代表運動速度越快,能夠通過稀疏光流可視化結果大概推斷出物體的運動信息,與實際運動狀態相符。 圖11 物體1稀疏光流可視化結果 圖12 物體2稀疏光流可視化結果圖2 3.1.2 稀疏光流結果驗證 由于檢測數據太多,選取前8個特征點進行驗證,表1的數據由原始數據精確到小數點后4位得到。像素點平均誤差用歐氏距離進行計算,如上所示:LK檢測的像素點平均誤差 εx,y=0.3805,大于基于單應性矩陣計算的匹配點平均誤差 εx,y=0.0589。由于基于單應性矩陣方法匹配效果好,所以本實驗的運動檢測基于單應性矩陣方法進行,具有較好的準確性。 表1 匹配點檢測結果 如表2所示,運動檢測平臺每2幀運動檢測的運行時間都在0.1s左右。本檢測平臺針對室內運動物體,運動速度較低,選取圖像幀間隔為0.5s,運動檢測算法可以滿足平臺需要。 表2 檢測平臺運行時間 s 相比較于稀疏光流,密集光流需要把目標物體每個像素點的光流計算出來[11],以更好地表示物體的運動狀態。為了更好地把運動檢測結果顯示出來,基于色環進行密集光流的可視化[12]。在編程過程中設定共有55個顏色表示不同的方向,每個色系顏色的深淺又代表物體在該方向上運動速度的大小。通過計算物體運動的最大速度,進行速度歸一化。色環圖如圖13所示。 圖13 色環 Farneback是一種常用的經典密集光流檢測算法,利用Farneback算法獲得的密集光流檢測結果如圖14、15所示。由圖14可以看出,可視化結果為藍色但顏色深淺不一,對比圖13可知,藍色代表物體往左邊運動,該可視化結果可以大致代表物體的真實運動。而對于圖15,可視化結果主要為黃色且顏色不單一,相比較實際物體向左的運動,對比圖13可知,該結果并不能代表物體的真實運動。 圖14 物體1Farneback方法可視化結果 圖15 物體2Farneback方法可視化結果 運用基于改進的單應性矩陣方法進行物體運動信息檢測,檢測結果如圖16、17所示。實際運動過程中物體均往左運動,可視化結果顯示為藍色,所代表的物體運動方向與實際一致。實驗結果驗證了運動檢測平臺的有效性。 圖16 物體1改進的單應性矩陣計算方法可視化結果 圖17 物體2改進的單應性矩陣計算方法可視化結果 本文設計了基于Kinect的運動檢測平臺,經運動結果可視化顯示和數據驗證,本檢測平臺提高了運動檢測的精度,符合實際物體運動情況。 1)本文在彩色圖像的基礎上,加上深度信息進行邊界判斷,基于感興趣區域進行單應性矩陣的計算,提高了算法的精度。 2)在Ubuntu系統下開發基于Kinect的運動檢測平臺,搭建ROS和OpenCV庫,實現了物體的圖像數據采集。 3)基于Kinect的運動檢測平臺可視化結果對比情況表明,該檢測平臺有較好的準確性,可提升運動檢測的精度,能夠很好地表示物體的運動信息。
2.4 光流估計


3 運動檢測平臺實驗驗證
3.1 稀疏光流法結果驗證




3.2 密集光流法結果驗證





4 結論