[AI開發]目標跟蹤之速度計算

基于視頻結構化的應用中,目標在經過跟蹤算法后,會得到一個唯一標識和它對應的運動軌跡,利用這兩個數據我們可以做一些后續工作:測速(交通類應用場景)、計數(交通類應用場景、安防類應用場景)以及行為檢測(交通類應用場景、安防類應用場景)。我會寫三篇文章依次介紹這三個主題。

(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)測速結果的準確性對參照物的標注依賴很大,后者直接影響測速結果。

當然,它的優勢前面已經提到了。本文只提供思路,沒有代碼。

posted @ 2019-06-06 16:38 周見智 閱讀(...) 評論(...) 編輯 收藏