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

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

(1)目標跟蹤之速度計算算法

(2)目標跟蹤之計數spa

(3)目標跟蹤之行爲檢測視頻

後面會陸續添加連接。htm

本篇文章以交通類應用場景爲例,介紹車輛速度計算方法。blog

 

速度計算前提圖片

速度=距離÷時間get

視頻是一個連續的圖片序列,咱們只要分別知道目標在第N幀和第M幀中的位置(像素座標),而後這兩幀之間的時間間隔,就能夠獲得目標在視頻圖像中的「像素速度」(像素/秒),計算方式很簡單:io

像素速度=像素距離÷時間原理

其中像素距離能夠經過目標在兩幀中對應的像素座標計算獲得(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)測速結果的準確性對參照物的標註依賴很大,後者直接影響測速結果。

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

相關文章
相關標籤/搜索