基於視訊結構化的應用中,目標在經過跟蹤演算法後,會得到一個唯一標識和它對應的運動軌跡,利用這兩個資料我們可以做一些後續工作:測速(交通類應用場景)、計數(交通類應用場景、安防類應用場景)以及行為檢測(交通類應用場景、安防類應用場景)。我會寫三篇文章依次介紹這三個主題。
(1)目標跟蹤之速度計算
(2)目標跟蹤之計數
(3)目標跟蹤之行為檢測
後面會陸續新增連結。
本篇文章以交通類應用場景為例,介紹車輛速度計算方法。
速度計算前提
速度=距離÷時間
視訊是一個連續的圖片序列,我們只要分別知道目標在第N幀和第M幀中的位置(畫素座標),然後這兩幀之間的時間間隔,就可以得到目標在視訊影象中的“畫素速度”(畫素/秒),計算方式很簡單:
畫素速度=畫素距離÷時間
其中畫素距離可以通過目標在兩幀中對應的畫素座標計算得到(X1-X2)+(Y1-Y2),又由於視訊幀率比較固定,一般視訊FPS為25,那麼每幀時間為40ms,(M-N)*40即為目標從N幀中位置移動到M幀中位置耗費的時間。如果我們又知道視訊畫面中每畫素代表的實際物理距離(米),那麼最終的目標運動速度就非常好計算了。
但是,由於攝像機在拍攝三維空間畫面成像時,會存在透視。假設目標在三維空間的路面直線運動,由遠到近(反之亦然),即使目標的實際運動速度固定不變,我們在視訊畫面觀察到的畫素速度卻是在不斷變化的,而且這個變化並不呈線性關係。換句話說,視訊畫面中每畫素代表的實際距離並不固定:
實際物理速度!=畫素速度*某值
這個問題就非常麻煩了,由於視訊畫面中的畫素距離和實際物理距離不存線上性對應關係,我們不能簡單通過目標的畫素座標和時間間隔來計算目標的實際運動速度。
兩種解決方案:
1)雖然畫素距離和實際物理距離不存在簡單的線性對應關係,但是我們可以加入其他條件值,找出畫素距離和實際物理距離的對映關係,比如目標由遠及近,當視訊畫面累計運動5畫素時,實際累計運動距離為5米,當視訊畫面累計運動10畫素時,實際累計運動距離為8米,以此類推。找到這種對映關係的前提是需要加入其他條件值,比如攝像機與地面的垂直高度等,見後面“視訊測速通常做法”。
2)通過變換,將視訊畫面轉換成“俯視視角”(站在道路上方俯視道路)。經過這種變換之後,路面所有的運動目標都可以看作是2D平面運動,變換之後的每畫素所代表的實際物理距離固定不變(米/畫素)。這樣一來,計算實際物理速度就非常簡單了,先計算畫素速度,然後再乘以一個固定值即可得到實際物理速度。這種畫面轉換也需要提供一些引數,但是相比第1)種,引數來源簡單許多。
視訊車輛測速通常做法
常見的視訊測速做法是,根據一系列引數,比如攝像機距離地面的垂直高度、攝像機焦距等,來計算兩幀之間車輛的實際物理位移差,再除以兩幀之間的時間,得到車輛的形式速度。該方式的前提是需要知道每個測量位置攝像機的屬性引數,而現實中獲取這些引數非常困難:
如上圖,根據攝像機成像原理,三維空間在二維畫面上投影之後,會存在對應角度關係,可以列出等式,計算機動車在路面行駛的實際距離。這種做法的前提是我們必須知道圖中的H_CAM(攝像機距離地面的高度)、D_NEAR(攝像機成像最近點與攝像機垂直線之間的水平距離)以及D_FAR(攝像機成像最遠點與攝像機垂直線之間的水平距離),而這些引數獲取在現實應用場景中基本不可能做到。
另外一些視訊測速的方式跟上面差不多,只是需要的引數有些差異,比如不需要D_NEAR和D_FAR的值,但是必須知道攝像機的焦距等引數,這些引數也是非常難以得到。
基於透視變換的車輛測速方法
前面提到過,如果將視訊畫面轉換成俯檢視,視角垂直於路面,這樣能保證畫面中每畫素所代表的實際物理距離固定不變。任何目標運動速度都可以根據畫素位移差和時間差計算得到。這種做法的前提是,如何將任意視訊畫面轉換成俯檢視?
熟悉OpenCV的童鞋可能知道,OpenCV中有透視轉換的概念,如果我們知道原視訊畫面中一個真實矩形的四個頂點座標,那麼我們可以直接利用這四個頂點來計算影象的透視轉換矩陣(原圖->俯檢視),得到透視轉換矩陣後,我們就可以將源視訊畫面的任意一個點座標轉換成俯檢視中的點座標。假設源視訊畫面中,目標第N幀的座標為(Xn、Yn),目標第M幀的座標為(Xm、Ym),那麼經過轉換之後,在俯檢視畫面中,目標第N幀的座標為(Xn`, Yn`),目標第M幀的座標為(Xm`, Ym`),假設在短時間內,目標車輛沿道路方向做直線勻速運動,那麼最終的Xn` 和 Xm`的值應該相等(水平位移分量為零),而(Ym` - Yn`)的值即為目標車輛沿道路方向行駛的畫素距離,前面說到過,俯檢視中的每畫素距離代表的實際物理距離是固定不變的(假設為W),那麼我們很容易得到目標車輛沿道路方向行駛的實際物理距離,即為 (Ym` - Yn`)*W。然後將得到的結果再除以N幀到M幀之間的時間 (M-N)*40ms,就可以得到目標車輛在這段時間內的平均速度(米/秒),如果M和N相差很小,假設相隔5幀,那麼這個速度即可代表目標車輛的實時車速了。
上面這種測速方式的前提有兩個:
(1)知道路面上一個真實矩形在源視訊畫面中的四個頂點座標
(2)知道俯檢視中每畫素代表的實際物理距離
第(1)個前提相比獲取攝像機與地面的垂直高度而言,要簡單得多。實際應用場景中,路面有非常多的參照物可以來確定一個真實的矩形四個頂點座標。第(2)個也比較容易,一般車道分割線都是由實線-虛線間隔而成的,而實線的長度是固定的(高速公路一般實線長度為6米),我們只需要在源視訊畫面中標定一根實線線段的起始點座標即可,假設為(X1, Y1), (X2, Y2),通過轉換矩陣將其轉換成俯檢視中的座標,假設為(X1`, Y1`), (X2`, Y2`),由於車道分割線的方向與道路方向一致,那麼X1`和X2`理論上應該相等(水平分量為零),6米/ (Y2` - Y1`)即可以代表俯檢視中(車道方向)每畫素代表的實際物理距離。
下圖選取了路面中一個實際矩形在源視訊畫面中的四個頂點(紅色),以及一個車道分割線參照線段的兩個端點(黃色):
經過透視變換之後:
可以看到,經過透視變換之後生成的俯檢視中,我們將路面的矩形還原成了“真正的”矩形,並且可以看到,車道分割線是均勻分佈的,兩條分割線也是平行的,這符合我們的預期,即:俯檢視中,無論是道路的平行方向,還是道路的垂直方向,每畫素所代表的實際物理距離是固定不變的。目標車輛在俯檢視中,只會存在與道路平行方向的位移差,與道路垂直方向的分量為零,這符合俯視角度觀察到的結果。
注意:需要忽略其他與道路不在同一個平面上的物體,這種透視變換隻對道路平面有效。
另外再舉一個攝像機角度比較好的例子:
上圖是選取的矩形四個頂點,下圖是透視變換之後的俯檢視:
經過轉換之後生成的俯檢視,可以作為矩形標註的參考,如果發現生成的俯檢視完全不對,那麼說明標註的矩形四個頂點座標有問題。
經過實際使用發現,這種測速誤差在±6%之內,這種準確性雖然不能用於交通執法,但是對於交通狀況監測還是非常有參考價值的。當然這種方法也有劣勢:
(1)參考矩形不太好標註,有的路面甚至沒有任何參照物。完全靠經驗去嘗試;
(2)有的路面沒有距離參照物,比如不存在車道分割線(虛線),這種情況無法測速;
(3)測速結果的準確性對參照物的標註依賴很大,後者直接影響測速結果。
當然,它的優勢前面已經提到了。本文只提供思路,沒有程式碼。