Open3d学习计划—高级篇 2(彩色点云配准)
Open3D是一個開源庫,支持快速開發和處理3D數據。Open3D在c++和Python中公開了一組精心選擇的數據結構和算法。后端是高度優化的,并且是為并行化而設置的。
本系列學習計劃有Blue同學作為發起人,主要以Open3D官方網站的教程為主進行翻譯與實踐的學習計劃。點云PCL公眾號作為免費的3D視覺,點云交流社區,期待有使用Open3D或者感興趣的小伙伴能夠加入我們的翻譯計劃,貢獻免費交流社區,為使用Open3D提供中文的使用教程。
本教程演示了一種同時使用幾何和顏色進行配準的ICP變體。它實現了這篇文章的算法 [Park2017] ,實現了顏色信息鎖定與切平面的對齊(The color information locks the alignment along the tangent plane)。這個算法與之前的ICP配準速度相當,但是實現了更高的精度和魯棒性。本教程使用的符號來自ICP配準。
可視化函數
為了掩飾不同顏色點云之間的對齊,draw_registration_result_original_color使用原本的顏色可視化源點云.
def draw_registration_result_original_color(source, target, transformation):source_temp = copy.deepcopy(source)source_temp.transform(transformation)o3d.visualization.draw_geometries([source_temp, target])
注意:這里原來的教程里可視化函數都加了初始視角之類的,但是很多人反映這個會報錯,并且官方函數里也沒給出可接受的參數,所以在這里把初始視角的參數都去掉了
輸入
這段代碼從兩個文件中讀取源點云和目標點云.使用單位陣作為初始化的配準矩陣.
print("1. Load two point clouds and show initial pose")
source = o3d.io.read_point_cloud("../../TestData/ColoredICP/frag_115.ply")
target = o3d.io.read_point_cloud("../../TestData/ColoredICP/frag_116.ply")# draw initial alignment
current_transformation = np.identity(4)
draw_registration_result_original_color(source, target, current_transformation)
Point-to-plane ICP
我們首先使用?Point-to-plane ICP?作為一個基準算法.下面的可視化結果展示了未對其的綠色三角形紋理.這是因為幾何約束不能夠阻止兩個平面滑動.
# point to plane ICP
current_transformation = np.identity(4)
print("2. Point-to-plane ICP registration is applied on original point")
print(" clouds to refine the alignment. Distance threshold 0.02.")
result_icp = o3d.registration.registration_icp(source, target, 0.02, current_transformation,o3d.registration.TransformationEstimationPointToPlane())
print(result_icp)
draw_registration_result_original_color(source, target, result_icp.transformation)
彩色點云配準
彩色點云配準的核心函數是 registration_colored_icp .
在這篇文章中,他使用的是具有聯合優化目標的ICP迭代(細節請看?Point-to-point ICP):
這里的?T 是被估計旋轉矩陣. E_C 和? E_G分別是光度項和幾何項.?δ ∈ [ 0 , 1 ]? δ∈[0,1]是通過經驗決定的權重變量.
這里的幾何項 E_G 和?Point-to-plane ICP?的目標是相等的.
這里的 K是當前迭代的對應集, n_p 是對應點 p?的法線.
顏色項E_C測量的是q 點的顏色(用 C(q))?表示)與其在點p的切平面的投影上的顏色之間的差.
這里的C_p 是在?p? 的切平面上連續定義的預計算函數. 函數 f(?)?將3D點投影到切平面.更多細節請參看?[Park2017].
為了提高效率,?[Park2017]提供了多尺度的配準方案,已經在以下接口中實現.
# colored pointcloud registration
# This is implementation of following paper
# J. Park, Q.-Y. Zhou, V. Koltun,
# Colored Point Cloud Registration Revisited, ICCV 2017
voxel_radius = [0.04, 0.02, 0.01]
max_iter = [50, 30, 14]
current_transformation = np.identity(4)
print("3. Colored point cloud registration")
for scale in range(3):iter = max_iter[scale]radius = voxel_radius[scale]print([iter, radius, scale])print("3-1. Downsample with a voxel size %.2f" % radius)source_down = source.voxel_down_sample(radius)target_down = target.voxel_down_sample(radius)print("3-2. Estimate normal.")source_down.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=radius * 2, max_nn=30))target_down.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=radius * 2, max_nn=30))print("3-3. Applying colored point cloud registration")result_icp = o3d.registration.registration_colored_icp(source_down, target_down, radius, current_transformation,o3d.registration.ICPConvergenceCriteria(relative_fitness=1e-6,relative_rmse=1e-6,max_iteration=iter))current_transformation = result_icp.transformationprint(result_icp)
draw_registration_result_original_color(source, target, result_icp.transformation)
Colored point cloud registration
[50, 0.04, 0]
3-1. Downsample with a voxel size 0.04
3-2. Estimate normal.
3-3. Applying colored point cloud registration
registration::RegistrationResult with fitness=8.763667e-01, inlier_rmse=1.457778e-02, and correspondence_set size of 2084
Access transformation to get result.
[30, 0.02, 1]
3-1. Downsample with a voxel size 0.02
3-2. Estimate normal.
3-3. Applying colored point cloud registration
registration::RegistrationResult with fitness=8.661842e-01, inlier_rmse=8.759721e-03, and correspondence_set size of 7541
Access transformation to get result.
[14, 0.01, 2]
3-1. Downsample with a voxel size 0.01
3-2. Estimate normal.
3-3. Applying colored point cloud registration
registration::RegistrationResult with fitness=8.437191e-01, inlier_rmse=4.851480e-03, and correspondence_set size of 24737
Access transformation to get result.
使用 voxel_down_sample 創造了三層多分辨率的點云.使用頂點法線估計來計算的法線.核心的配準函數 registration_colored_icp 在每一層從粗糙到精細都有調用.lambda_geometric 是 registration_colored_icp 中可選的參數,用于確定(1-δ)E_c + δE_G 中的?δ ∈ [ 0 , 1 ]?
輸出的是兩組緊密對齊的點云,注意看上面的綠色三角形.
資源
三維點云論文及相關應用分享
【點云論文速讀】基于激光雷達的里程計及3D點云地圖中的定位方法
3D目標檢測:MV3D-Net
三維點云分割綜述(上)
3D-MiniNet: 從點云中學習2D表示以實現快速有效的3D LIDAR語義分割(2020)
win下使用QT添加VTK插件實現點云可視化GUI
JSNet:3D點云的聯合實例和語義分割
大場景三維點云的語義分割綜述
PCL中outofcore模塊---基于核外八叉樹的大規模點云的顯示
基于局部凹凸性進行目標分割
基于三維卷積神經網絡的點云標記
點云的超體素(SuperVoxel)
基于超點圖的大規模點云分割
更多文章可查看:點云學習歷史文章大匯總
SLAM及AR相關分享
【開源方案共享】ORB-SLAM3開源啦!
【論文速讀】AVP-SLAM:自動泊車系統中的語義SLAM
【點云論文速讀】StructSLAM:結構化線特征SLAM
SLAM和AR綜述
常用的3D深度相機
AR設備單目視覺慣導SLAM算法綜述與評價
SLAM綜述(4)激光與視覺融合SLAM
Kimera實時重建的語義SLAM系統
SLAM綜述(3)-視覺與慣導,視覺與深度學習SLAM
易擴展的SLAM框架-OpenVSLAM
高翔:非結構化道路激光SLAM中的挑戰
SLAM綜述之Lidar SLAM
基于魚眼相機的SLAM方法介紹
往期線上分享錄播匯總
第一期B站錄播之三維模型檢索技術
第二期B站錄播之深度學習在3D場景中的應用
第三期B站錄播之CMake進階學習
第四期B站錄播之點云物體及六自由度姿態估計
第五期B站錄播之點云深度學習語義分割拓展
第六期B站錄播之Pointnetlk解讀
[線上分享錄播]點云配準概述及其在激光SLAM中的應用
[線上分享錄播]cloudcompare插件開發
[線上分享錄播]基于點云數據的?Mesh重建與處理
[線上分享錄播]機器人力反饋遙操作技術及機器人視覺分享
[線上分享錄播]地面點云配準與機載點云航帶平差
點云PCL更多活動請查看:點云PCL活動之應屆生校招群
掃描下方微信視頻號二維碼可查看最新研究成果及相關開源方案的演示:
如果你對Open3D感興趣,或者正在使用該開源方案,就請加入我們,一起翻譯,一起學習,貢獻自己的力量,目前階段主要以微信群為主,有意者發送“Open3D學習計劃”到公眾號后臺,和更多熱愛分享的小伙伴一起交流吧!如果翻譯的有什么問題或者您有更好的意見,請評論交流!!!!
以上內容如有錯誤請留言評論,歡迎指正交流。如有侵權,請聯系刪除
掃描二維碼
? ? ? ? ? ? ? ? ? ?關注我們
讓我們一起分享一起學習吧!期待有想法,樂于分享的小伙伴加入免費星球注入愛分享的新鮮活力。分享的主題包含但不限于三維視覺,點云,高精地圖,自動駕駛,以及機器人等相關的領域。
分享及合作方式:微信“920177957”(需要按要求備注) 聯系郵箱:dianyunpcl@163.com,歡迎企業來聯系公眾號展開合作。
點一下“在看”你會更好看耶
總結
以上是生活随笔為你收集整理的Open3d学习计划—高级篇 2(彩色点云配准)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下编译pcl-master
- 下一篇: SLAM综述(1)-Lidar SLAM