前段時間寫了一篇關於U-V視差理論的博客(雙目視覺(六)U-V視差),這裏主要講講U-V視差如何用在實踐中。
1.U-V視差中的信息
首先,我們來看看在U-V視差中可以提取到的信息:
- U視差圖:
- U視差圖是對視差圖像的U列進行統計,相當於垂直投影圖像,有點類似於鳥瞰圖。
- U視差圖可以看作是視差圖的俯視圖,可以從中得到障礙物的位置信息。
- U視差圖中主要由橫線、斜線組成。
- 障礙物在圖中表現爲橫線,當橫線的傾斜角θ較小時,橫線的長短代表障礙物的橫向尺寸,橫線越在圖像的下方,視差越大,離相機越近,橫線的列座標位置表明障礙物在圖像中左右的位置。
- V視差圖:
- V視差圖是對視差圖像的V行進行統計,相當於水平投影圖像。
- V視差圖可以看作是視差圖的側視圖,也可以從中得到障礙物的位置信息。
- V視差圖中主要由豎線、斜線組成。
- 障礙物在圖中表現爲豎線,當橫線的傾斜角θ較小時,豎線的長短代表障礙物的縱向尺寸,豎線越在圖像的右方,視差越大,離相機越近,豎線的行座標位置表明障礙物在圖像中上下的位置。
- 地面在圖中的表現爲斜線,地面的障礙物(豎線)與斜線有一個交點,這個交點的行座標可以轉化爲原圖中障礙物與低迷那平行的行座標。
根據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
霍夫變換直線檢測(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