【項目實戰】利用U-V視差進行地面檢測

前段時間寫了一篇關於U-V視差理論的博客(雙目視覺(六)U-V視差),這裏主要講講U-V視差如何用在實踐中。

1.U-V視差中的信息

首先,我們來看看在U-V視差中可以提取到的信息:

  • U視差圖:
  1. U視差圖是對視差圖像的U列進行統計,相當於垂直投影圖像,有點類似於鳥瞰圖。
  2. U視差圖可以看作是視差圖的俯視圖,可以從中得到障礙物的位置信息。
  3. U視差圖中主要由橫線、斜線組成。
  4. 障礙物在圖中表現爲橫線,當橫線的傾斜角θ較小時,橫線的長短代表障礙物的橫向尺寸,橫線越在圖像的下方,視差越大,離相機越近,橫線的列座標位置表明障礙物在圖像中左右的位置
  • V視差圖:
  1. V視差圖是對視差圖像的V行進行統計,相當於水平投影圖像
  2. V視差圖可以看作是視差圖的側視圖,也可以從中得到障礙物的位置信息。
  3. V視差圖中主要由豎線、斜線組成。
  4. 障礙物在圖中表現爲豎線,當橫線的傾斜角θ較小時,豎線的長短代表障礙物的縱向尺寸,豎線越在圖像的右方,視差越大,離相機越近,豎線的行座標位置表明障礙物在圖像中上下的位置
  5. 地面在圖中的表現爲斜線,地面的障礙物(豎線)與斜線有一個交點,這個交點的行座標可以轉化爲原圖中障礙物與低迷那平行的行座標。

根據V視差中的斜線,可以檢測到原圖像中的地面,根據U視差中的橫線或者V視差中的豎線,可以找到原圖中的障礙物的位置。

這裏我們主要來看看如何實現可行駛區域的檢測。

2.具體實現:

1.視差估計

對於視差的估計這裏我使用的opencv中自帶的SGBM方法,如果有更好的視差估計方法你也可以將這部分替換。

2.V視差的估計

V視差的估計通過對原視差圖像進行水平投影而得到,統計原視差圖中每行不同視差的數量。

3.地平面線的檢測

有了V視差圖,我們就可以提取V視差中的信息了,我們知道,原視差中的地面映射爲了V視差中的斜線,那麼我們就需要將這條斜線檢測出來。

  • 閾值濾除

進行閾值濾除主要濾除一些統計信息較低的點,因爲一般地面或者障礙在V視差中的統計量都是比較多的。

  • LSD直線檢測

直線檢測的方法有很多,比如經典的霍夫變換,霍夫變換的變種,直線擬合等等,這裏主要因爲實效性,採用了LSD直線檢測。

  • 直線分類與合併

從上圖可以看出,檢測出來的直線有傾斜的,也有垂直的,我們檢測的地面映射爲傾斜的直線,障礙物映射爲近乎垂直的線。

通過LSD檢測出來的直線只要包含四個參數:線段的兩個短點的x,y座標,我們根據兩端點的y座標的差值,可以初略將直線分組。然後將斜線的這組線段進行合併,合併爲一條直線。合併完後的直線可能不只一條,我們選擇權重高的作爲我們的最終直線。

  • 直線的參數計算

通過我們合併得到的直線,我們可以計算直線的參數:斜率和偏移量。

  • 直線的交點

爲什麼要統計每列和直線的交點呢?這裏的交點是障礙物與地面的臨界點,也就是我們原視差圖地面的邊界點的映射,這也是爲了後續生成地面的mask做準備。

4.初始化地面的mask

剛纔我們得到了V視差中,每列和地面斜線的交點,根據這個交點,我們可以得到初始的地面的mask。

5. RANSAC平面擬合

得到了地面的初始的mask,這個是不能直接應用的,因爲裏面含有一些噪點,這裏我們採用RANSAC方法來估計平面參數。

一般RANSAC方法主要包括如下幾個步驟:

  • 初始的樣本,這裏需要保證正樣本的數量大於負樣本的。
  • 隨機採樣。
  • 參數估計。
  • 計算內點。
  • 判斷內點數量。

 6.提純擬合平面

從上面可以看出,擬合出來後的平面還是包含有一些小的噪聲塊,但是我們需要的平面其實佔據的大量的面積,可以通過尋找輪廓,然後找出最大的面積塊。

7.顯示

參考:

LSD:一種直線檢測算法簡介:https://blog.csdn.net/carson2005/article/details/9326847

https://docs.opencv.org/3.4.7/df/d4c/classcv_1_1ximgproc_1_1FastLineDetector.html#a10d3ce6ef6bce92818d1f919e2b2aa57

霍夫變換直線檢測(Line Detection)原理及示例:https://blog.csdn.net/leonardohaig/article/details/87907462

形狀識別之直線檢測:https://blog.csdn.net/liujiabin076/article/details/74917605

基於線條特徵的機場檢測算法——LSD直線檢測算法、平行線組提取和聚類:https://blog.csdn.net/weixin_42647783/article/details/83352454

OpenCV基礎——threshold函數的使用:https://blog.csdn.net/u012566751/article/details/77046445

數學形態學運算——腐蝕、膨脹、開運算、閉運算:https://blog.csdn.net/chaolei3/article/details/79618602

https://www.doc88.com/p-7196258438237.html

https://blog.csdn.net/leonardohaig/article/details/88240112

https://blog.csdn.net/qq_23880193/article/details/49669297

https://blog.csdn.net/jidushanzhu/article/details/68924719#commentBox

https://github.com/1zlab/1ZLAB_OpenCV_Laser_Cross

https://www.doc88.com/p-1486694512614.html

https://www.doc88.com/p-7778764892199.html

https://stackoverrun.com/cn/q/5215019

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章