本文的內容主要講述AVM 3D算法pipeline,一種自研提取角點標定方法,汽車輔助視角。每個部分都涵蓋了完整的算法理論以及部分代碼,適合有一些計算機視覺基礎的同學,或許可以給相關方向的同學做些參考。
·雙峰自適應閾值二值化大體思路為:計算圖像的亮度直方圖。分別計算暗區局部極大值,亮區局部極大值,即“雙峰”。計算雙峰亮度的平均值,作為閾值,來對圖像做二值化。因此稱為“雙峰自適應閾值”。
·使用上述約束條件篩選出大方格的角點。綜上,使用這種方法提取出的角點分布得更廣泛,且都在鳥瞰圖的分布區域,因此拼接融合得效果更佳。
大部分車上的廣角功能是對魚眼圖直接做了去畸變,這種方法帶來的問題及產生原因如下:·放大上表中普通廣角圖,不難發現標定布前邊緣并不是平直的,它有一定的傾斜。這是因為相機有一個roll翻滾角,相當于人眼沒有水平正視前方,而是歪著腦袋看前面。·在遠離圖像中心的位置,像素被嚴重拉伸,這是透視畸變的一種(見附錄),會導致即便是我們把去畸變圖的分辨率調整到非常大,在這張圖像上依然不能看到FOV范圍很大的內容,如圖所示。
這個流程與上面的車輪視角的算法流程幾乎是相同的,所有的相機位姿變換導致的視角轉換都可以用這個流程來實現。在上面的相機位姿矯正示意圖中我們可以看到,垂直于地面的墻、柱子的傾斜問題都解決了。被我們用基于相機位姿矯正的單應變換強行掰正了。但是,這個圖在遠離圖像中心的邊緣依然存在嚴重的拉伸。導致即使圖像的分辨率很大,我們可以看到的實際FOV范圍依然很小。針對這個問題,再一次進行平面的單應變換。·平面單應變換
廣角與超廣角實際的實現方法如下圖所示,在廣角圖像上選取4個點(即遠離圖像中心在圖像左右兩邊的兩個小長方形),并設置這四個點做投影變換的結果(這4個點是通過大量實驗調試出的一組最優超參數),使用這四對匹配點計算單應矩陣H。即計算將小長方形壓縮成梯形的單應矩陣H。
一. 一種更優的聯合標定方案
1.1 算法原理分析
在前面的工作中,我們調用opencv函數findChessboardCorners提取圖像上位于標定布中間的棋盤格角點,然后計算投影矩陣H。在SLAM 14講中[1],計算H就是求解Ax=0這樣一個問題。其原理就是構造一個最小二乘的形式,用奇異值分解的方式來計算一個誤差最小的解。而為了逼近這個最小誤差,可能造成除了棋盤格角點以外的其他像素值的投影誤差很大。換句話說,由于棋盤格角點集中于鳥瞰圖的中心很小的一部分區域,如果選擇棋盤格角點進行H的計算,會導致只有棋盤格附近的區域能夠進行準確的投影,遠離該區域會有較大誤差。類似于nn的訓練數據過于局限,訓練的模型過擬合了。這也就能夠解釋為什么在之前的工作中,我們的鳥瞰圖拼接區域總是拼不齊,就是因為我們選擇的角點遠離拼接區域,計算出的投影矩陣H在拼接區域的投影誤差太大。我們開發了一種基于自動提取角點算法的汽車標定方法,該方法可以提取標定布上拼接區域黑色方格的角點。如圖所示:
1.2 基于自動提取角點算法的汽車標定方法
1. 雙峰自適應閾值二值化 2. 多邊形檢測 3. 四邊形篩選 4. 提取四邊形頂點 |
1. 多邊形擬合結果必須為四邊形,即篩選出二值化圖中的四邊形 2. 四邊形面積必須大于某閾值(opencv源碼中這個超參適用于篩選棋盤格的,我們要把這個閾值搞得大一些,用于篩選大方格) 3. 相鄰邊長不可相差過多 4. 選取黑色的四邊形,而不是白色的四邊形 5. 限制四邊形分布范圍,即四邊形不能過于靠近圖像邊緣,具體情況與相機的位姿相關 |
二. AVM輔助視角——基于外參的視角變換
本章節主要講述單應矩陣與PNP的原理,以及它們在AVM輔助視角中的實際應用,附帶部分代碼。關鍵詞:單應矩陣、PNP、標定、廣角、超廣角、車輪視角、越野模式車載魚眼相機可以獲取到范圍非常大的內容,但是魚眼圖像并不能夠在汽車行駛過程中給駕駛員提供符合人類視覺習慣的視頻圖像,這一章節主要來講述如何利用魚眼相機的圖像信息,來提供各種輔助視角。例如:(1)在進出車位或經過狹小空間時,駕駛員會更加關注車輪位置的內容,那么我們需要使用某種算法對左側、右側的魚眼相機拍攝到的內容進行處理,得到“車輪視角”;
2.1 單應矩陣H的原理
有CV基礎的同學們大多知道單應矩陣表示“一個平面到另外一個平面的變換關系”。這樣的描述是不準確的,或者如果對單應矩陣僅能說出這些,說明對單應矩陣的認識是片面的。正確的理解應該是:H描述的是在不同位姿下的兩個相機cam1,cam2拍攝同一個平面(例如標定板),這個平面在兩個相機成像平面上的成像結果之間的變換關系。投影變換模型圖如下。以上這段話,被很多人簡單理解成了“H描述的是兩張圖象之間的變換關系”,這里有兩個點需要注意:(1)不要忽略掉了前面那部分和相機投影相關的物理模型(2)H描述的是空間中的某個平面分別在兩個相機圖像平面上的成像結果之間的變換,而不是兩個圖像之間的變換。對于單應矩陣,我們可以思考一個問題:我們拍攝到的內容,大多數情況下不僅僅包含某一個平面。而我們在做投影變換的時候,H就是基于某個平面計算出來的,這會導致雖然圖像中的該平面部分的投影是合理的,但是因為平面以外的其他部分依然用相同的H做投影,這些部分的投影結果就會顯得非常的奇怪。相信很多同學聽說過一個結論:基于H的圖像拼接方法,比較適用于視距較遠的環境下。這是因為視距較遠的環境下,拍攝到的景象我們可以近似認為它們在同一個平面上,那么我們基于這個平面計算出來的H,就幾乎適用于整個圖像中的內容。我們從最基礎的相機物理模型來推導一遍單應矩陣H的公式,這樣有利于我們更深入地理解。(本文僅推導這一個公式,通過物理模型對單應矩陣進行推導對后面的算法理解十分重要)如圖所示,同一個相機在A,B兩個位置以不同的位姿拍攝同一個平面:
2.2 PNP的原理
用一句話概括PNP到底做了什么:已知相機A坐標系下的一組三維點,以及這組三維點在另外一個相機的圖像坐標系下的二維坐標,就可以通過數學方法計算出A、B兩個相機之間的位姿R,t。注意R,t是從A->B。公式如下:
2.3 車輪視角
//函數定義 void solveRtFromPnP(const vector &corners2D, const vector &obj3D, const Mat &intrinsic, Mat &R, Mat &t) { Mat r = Mat::zeros(3, 1, CV_32FC1); solvePnP(obj3D, corners2D, intrinsic, cv::Mat(), r, t); Rodrigues(r, R); } //函數調用 solveRtFromPnP(corners_2D, obj_3D, m_intrinsic_undis, R, t);
以上,我們獲取到了虛擬相機->真實部署相機之間的位姿R,t。至于R,t為什么不是從真實部署相機->虛擬相機,可以從PNP算法的公式推導中得知(前面已經講過),或者見視覺SLAM第二版P180-P181。再回到投影變換H模型圖中,圖中的A就是虛擬相機,B就是真實部署相機。我們已經通過PNP計算出虛擬相機->真實部署相機的R,t。但是我們想要的是如何將真實相機拍攝到的某個平面(對于車輪視角而言是地面)通過H轉換到虛擬相機的視角下。因此我們需要對R,t做一些處理,將其轉化為真實部署相機->虛擬相機的位姿關系:公式推導:
//基于Rt計算H Mat solveHFromRt(const Mat &R, const Mat &t, const float d, const Mat &n, const Mat &intrinsic) { Mat intrinsic_inverse; invert(intrinsic, intrinsic_inverse, DECOMP_LU); Mat H = intrinsic * (R + t / d * n.t()) * intrinsic_inverse; return H; }
PNP求解外參:/****************************************************************************************************************/ //R t:PNP算出的結果,從虛擬相機->真實部署相機的位姿 //計算出 真實部署相機->虛擬相機的位姿 Mat R_Camera2Real; invert(R, R_Real2Virtual, DECOMP_LU); Mat t_Real2Virtual = -R_Real2Virtual * t; //虛擬相機到地面的垂直單位向量 Mat n = (Mat_(3, 1) << 0, 1, 0); //真實部署相機到地面的垂直單位向量 n = R * n; // rotation float theta_X = m_wheel_sight_angle / 180.f * 3.14f; Mat R_virtual = (Mat_(3, 3) << 1, 0, 0, 0, cos(theta_X), -sin(theta_X), 0, sin(theta_X), cos(theta_X)); R_Camera2Virtual = R_virtual * R_Camera2Virtual; t_Camera2Virtual = R_virtual * t_Camera2Virtual; //計算單應矩陣H:真實視角->虛擬視角 Mat H = solveHFromRt(R_Camera2Virtual, t_Camera2Virtual, d, n, intrinsic);
幾點說明:·n(0,1,0),說明單應矩陣選取的平面為地面。不要忘了我們最開始強調的,H描述的是在不同位姿下的兩個相機cam1,cam2拍攝同一個平面(例如標定板),這個平面在兩個相機成像平面上的成像結果之間的變換關系。因此這個平面的選擇,對最終的投影結果有很大的影響。車輪視角選取地面作為我們要進行投影的平面,最終的效果非常nice。·代碼中還包含rotation部分,這是因為我們在標定的時候讓虛擬相機朝正前方,但顯然理想的車輪視角相機應該朝向車輪,即應加一個俯仰角pitch。2.4 超級廣角
這部分我們是對標現有某德系車載超廣角功能進行實現的,相比于直接做去畸變的廣角效果,超廣角的優勢在于·糾正了相機翻滾角帶來的視覺不適·糾正了左右兩側遠離圖像中心的拉伸效果·糾正了豎直方向由于透視畸變“近大遠小”帶來的柱體傾斜效果
1. 假設虛擬相機的位姿為朝向正前方,光軸與正前方的那面墻垂直,坐標系x、y、z如上表中“位姿校正的廣角”所示 2. 標定出地面上那些角點在虛擬相機坐標系下的三維坐標 3. 在真實相機拍攝的圖像中提取角點的圖像坐標(實際上在第一章的標定過程中已經完成) 4. PNP計算虛擬相機->真實相機的位姿 RT 5. 計算真實相機->虛擬相機的位姿rt 6. 我們選定的是垂直于相機光軸的平面,計算這個平面從真實相機->虛擬相機的單應矩陣H,在我們的算法中,這個平面距離相機的距離d=10m,這是一個經驗值。 |

Mat H_left = getPerspectiveTransform(p_src_left, p_dst_left); Mat H_right = getPerspectiveTransform(p_src_right, p_dst_right);
三. 基于外參的3D 紋理映射方法
單目相機是丟失了深度信息的,計算機圖形學中經常會使用將紋理圖映射到某個3D模型上的方法,呈現出一種偽3D的效果,即紋理映射。在AVM中,通常使用將相機捕捉到的圖像當作紋理,以某種方式映射到 3D 碗狀模型上以呈現出一種3D 環視的效果。下面詳細講述下算法實現:3.1 3D模型
3.2 紋理映射
以前置相機為例,詳細描述3D模型與相機圖像之間的紋理映射關系:
//calculate pose solveRtFromPnP(img_corners, obj_corners, intrinsic_undis, R, t); //3dsmax->camera Mat pts_3DsMax = (Mat_<float>(3, 1) << vertex[i].x, vertex[i].y, vertex[i].z); Mat camera_points = R * pts_3DsMax + t; //camera coordinate ->img coordinate Mat coor = intrinsic_undis * camera_points / camera_points.at<float>(2, 0);
上述代碼將解析出來的3dsmax坐標系下的 3d碗模型的頂點三維坐標轉換到相機坐標系下,然后通過相機內參轉換到圖像坐標系。最終建立起3d碗模型與圖像紋理之間的映射關系。算法流程如下:算法流程1. 標定3dsmax坐標系下 標定布上角點的三維坐標。(即車身中心為原點的車身坐標系) 2. 檢測相機拍攝到圖像中標定布上角點的圖像坐標。(第一章中已標定) 3. 利用1、2的坐標信息,通過PNP計算出 3dsmax坐標系與相機坐標系之間的位姿關系 R,t 4. 解析3d碗狀模型的obj文件 5. 將解析出來的3d碗狀模型的頂點三維坐標,通過R,t轉換到相機坐標系下 6. 通過內參將相機坐標系的坐標轉換到圖像坐標系,建立起3d模型與相機圖像之間的紋理映射關系 |
3.3 融合
3.4 3D AVM算法存在的問題
在討論這個問題之前,我們首先要理解相機坐標系。相機坐標系一般x為朝右,y為朝下,z為朝向正前方。圖中標記的兩個坐標系分別為汽車前置攝像頭、左側攝像頭的位姿。一個安裝在汽車前方朝向前下方,一個安裝在汽車左側后視鏡朝向左下方。
四 附錄
透視畸變
·“近大遠小”“近大遠小”表達的是:同一個物體,在遠處的位置投影到相機平面上的大小要小于在近處的位置。例如,車道線投影到圖像上并不是平行線,會交于一點。下圖中O為相機原點,Image plane為相機成像平面,parallel lines為現實世界中兩條平行線。這兩條平行線投影到image plane上,距離相機越遠的位置,其間距投影到image plane上的長度越短,最后匯聚到一點,即“消失點”。這個現象就類似于我們對圖像做去畸變后,汽車前方兩個垂直的柱子在圖像中是斜的,最終會交于一點。但是如果相機光軸垂直于地面,車道線在圖像上的成像結果就是平行的,類似于BEV。所以,我們在做超廣角功能的時候,要對相機做位姿矯正,使相機的光軸朝向正前方,這樣得到的圖像結果中柱子就不會傾斜。
五 總結
本篇本章為avm系列的第二篇,至此AVM主要的算法原理已經講述完畢,包含有:相機模型、相機內外參標定、相機聯合標定方法、魚眼去畸變、投影變換、光流、拼接融合、PNP、3D紋理映射、上帝視角、3d視角、廣角、超廣角、車輪視角等。后續還要做一些其他工作,例如:亮度一致調整、基于車道線的道路自標定、動態拼接線、相機模型優化等。希望以后還有機會和同學們交流,共同進步!審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
算法
+關注
關注
23文章
4704瀏覽量
95047 -
自動泊車
+關注
關注
0文章
105瀏覽量
13981 -
自動駕駛
+關注
關注
788文章
14259瀏覽量
170108
原文標題:自動駕駛:自動泊車之AVM環視系統算法2
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
FPGA在自動駕駛領域有哪些應用?
是FPGA在自動駕駛領域的主要應用:
一、感知算法加速
圖像處理:自動駕駛中需要通過攝像頭獲取并識別道路信息和行駛環境,這涉及到大量的圖像處理任務。FPGA在處理圖像上的運算速度快,可并行性強,且功耗
發表于 07-29 17:09
FPGA在自動駕駛領域有哪些優勢?
可以根據自動駕駛系統的具體需求,通過編程來配置FPGA的邏輯功能和連接關系,以適應不同的應用場景和算法變化。這種靈活性使得FPGA能夠快速適應自動駕駛技術的快速發展和變化。
低延遲:
發表于 07-29 17:11
自動駕駛真的會來嗎?
實際上,按照美國高速公路安全委員會(NHTSA)的5個分級,特斯拉所使用的自動駕駛屬于第2級別的“混合功能自動化”,該級別主要包含能同時提供組合式的自動化功能。比如
發表于 07-21 09:00
細說關于自動駕駛那些事兒
輔助系統系統)用到的技術重迭。自駕車如何看見世界為什么要這么多種傳感器?優缺點互補目前多數車商在量產車中配備的“自動駕駛”功能,包含特斯拉、Volvo、Mercedes-Benz、奧迪等,事實上就是搭載
發表于 05-15 17:49
自動駕駛的到來
距離,更寬的速度探測范圍,以及更高的距離、速度及角度分辨率?! ×硗?,隨著V2V,V2X的普及,自動駕駛所需要處理的實時數據將呈現級數增長,這對處理芯片的性能也提出了更高的要求。ADI可以提供獨具特色
發表于 06-08 15:25
即插即用的自動駕駛LiDAR感知算法盒子 RS-Box
,即可快速、無縫地將激光雷達感知模塊嵌入到自己的無人駕駛方案中,真正實現“一鍵獲得自動駕駛激光雷達環境感知能力”。RS-BoxLiDAR感知算法專業硬件平臺RS-Box 由嵌入式硬件平臺、獨立操作
發表于 12-15 14:20
聯網安全接受度成自動駕駛的關鍵
隨著時代的演進與汽車工業技術、機器視覺系統、人工智能和傳感器相關技術上不斷創新與進步,無人自動駕駛汽車已不是一件遙不可及的夢想,Google與國際車廠相繼針對自動駕駛技術致力研究開發,進一步讓
發表于 08-26 06:45
評論