一、基於檢測框的重建(選題 5)
物體檢測是計算機視覺中一個常見的任務。通常,檢測網絡會輸出所有圖片中存在 的物體,每個物體以一個 2D 外包框表示,每個框還帶有物體標簽、置信度等信息。這是一個傳統的2D視覺問題,但是,通過SLAM的方式,如果我們在多個視角看到同一個物體的外包框,則可以推斷該物體的 3D 位置。 請參照文獻 [2] 和 [3](或自行搜索對應文獻),
完成下列任務:
- 推導基於對偶二次曲面的重建算法,說明其工作原理;
- 使用 g2o 或 ceres 實現該算法,完成一個演示用例。檢測框可使用任意檢測網絡完成。
1.1 對偶二次-基本概念
1)二元二次型
二次曲面是三維空間中由4×4對稱矩陣Q表示的曲面。在對偶形式中,二次曲面由一組切向平面定義,這些平面圍繞二次曲面形成一個包絡線。這雙二次曲面\(Q^∗\)定義以便所有平面π滿足\(π^TQ^∗π= 0\)。二次曲面一般是球體、橢球體、雙曲面、圓錐或圓柱體。
二次曲面有9個自由度。 它們對應於對稱矩陣的十個獨立元素 ,其中一個用於標度。我們可以用10個矢量\(q =(q_1,…,q_{10})\)代表一個通用的雙二次曲面。
當一個對偶二次曲面被投影到一個成像平面上時,它會創建一個對偶二次曲線,遵循簡單的規則\(C^*\) = P\(Q^*\) \(P^T\)。這里,\(P = K[R|t]\)是包含攝像機內外部參數的攝像機投影矩陣。二次曲線是二次曲面的二維對應物,並形成形狀,如圓、橢圓、拋物線或雙曲線。
- 約束二次曲面參數化
對偶二次曲面的一般形式既可以表示球面、橢球等封閉曲面,也可以表示拋物面、雙曲面等非封閉曲面。由於只有前者是有意義的表示對象地標,我們使用一個約束的對偶二次表示,以確保所表示的表面是一個橢球或球體。
我們將對偶二次曲面參數化,
\(Q^∗ = Z \overset{˘}{Q^∗} Z^T\)
其中,\(\overset{˘}{Q^∗}\)是一個橢球中心在原點,Z是一個齊次變換,為一個任意的旋轉和平移。 具體的 \(Z=\begin{bmatrix} R(\Theta ) & t\\ 0_3^T & 1 \end{bmatrix}\) 和 \(\overset{˘}{Q^∗} = \begin{bmatrix} s_1^2 & 0 & 0 &0 \\ 0 & s_2^2 & 0 & 0\\ 0 & 0 & s_3^2 &0 \\ 0 & 0 & 0 & -1 \end{bmatrix}\) 在\(t = (t_1,t_2,t_3)\)是二次曲面質心平移,\(R(θ)\)是一個旋轉矩陣定義的角度\(θ=(θ_1,θ_2,θ_3)\),\(s = (s_1,s_2,s_3)\)是二次曲面的形狀沿橢球的三個參數。
1.2 基於Apriltag 的相機位姿估計
圖 1.1 . 基於檢測框的相機位姿估計系統
該系統apriltag_AR的檢測的API由 AprilTag 3 提供,當相機拍攝到不同的tag后會識別出對應的id,如圖1.2所示:
圖 1.2. tag識別
此處我用一個tag作為目標物體,由相機進行檢測,由此估計相機的位姿和tag的檢測點。然后由估計出相機的位姿pose,然后再將tag四個角的坐標和相機位姿進行位姿的BA優化,如圖 1.3 所示。此處用一個立方體可視化相機的位姿估計效果。
圖 1.3. 相機位姿估計效果
1.3 基於普通圖片的相機位姿估計(待續)
將Apriltag的標簽替換成圖案 A,通過提取A的ORB特征點信息,然后由相機進行檢測匹配,檢測到相同的ORB特征信息后,用 cv::solvePnP
計算相機位姿。最后用光流法進行跟蹤目標物體。
圖案 A
1.4 環境重建(待續)
后續加入目標檢測物和周圍環境的特征點信息,進行環境的三維重建。
1.5 代碼
apriltag_AR: https://github.com/suljaxm/apriltag_AR
二、Kitti 的雙目視覺里程(選題1)
KITTI 的 Odometry 提供了左右雙目的視覺圖像(以及激光,但本作業不使用激光數據),並提供了標定信息。它一共含有若干個 Sequence,其中一部分 Sequence 的真實軌跡是開放的,另一部分則是隱藏的,作為測試使用。在 KITTI 官網可以上傳你對測試部分的軌跡估計,系統會計算與真實軌跡的差異,並給出評分。 現在我們已經介紹了所有關於視覺 SLAM 方面的內容,你可以基於已有算法,實現 一個雙目的視覺里程計了。Kitti 官網 odometry 分類下提供了雙目相機的所有信息。請你根據已學知識,實現雙目視覺里程計,然后運行任何一個 sequence,並與標准軌跡比較。
以下是實現過程中的一些提示。這是通常 SLAM 中的做法,你可以作為參考,但並不一定必須使用這樣的結構。 1. 你可以先實現一個 Frame-by-Frame 的里程計,即僅估計當前圖像與上一個圖像 之間的運動,然后把它們組成完整的相機軌跡。這樣的工作方式應該是有效的, 但誤差會很快累積,導致軌跡發散。
2.接下來,從軌跡中提取關鍵幀,對關鍵幀進行 bundle adjustment。由於 BA 過程重投影誤差必定是下降的,可以有效的抑制誤差累積。同時,你需要一個機制來管理所有地圖點和關鍵幀。
3.最后,請測試你的方案在 kitti 上的表現,例如軌跡精度,運行時間等等。
2.1 雙目相機標定
通過張正友標定法,求解左右相機內參數矩陣M、畸變系數矩陣D、以及右攝像頭相對於左攝像頭的旋轉矩陣R和平移向量t。
標定步驟,
步驟一:雙目相機讀取左右目圖片。
步驟二:使用函數findChessboardCorners
, initCameraMatrix2D
, stereoCalibrate
獲得雙目相機的內參數,並保存在 intrinsics.yml
文件中。
步驟三:使用函數 stereoRectify
獲得雙目相機外參數,並保存在 extrinsics.yml
文件中。
圖 2.1 矯正的雙目顯示圖
2.2 深度圖計算
借助之前標定的相機參數,我們獲得已經處理好的雙目圖片如下:
圖 2.2 左右雙目圖片
通過雙目計算深度的公式,獲得深度圖,視差圖和深度圖如下:
圖 2.3 視差圖和深度圖
2.3 基於雙目的VO(待續)
通過修改SLAM14講中 基於RGBD的視覺里程計,將VO中的深度圖替換成由雙目計算出深度圖。
2.4 KITTI數據集測試(待續)
2.5 代碼
kingcent_stereo_demo: https://github.com/suljaxm/kingcent_stereo_demo