Open3d学习计划—高级篇 7(颜色映射)
Open3D是一個開源庫,支持快速開發和處理3D數據。Open3D在c++和Python中公開了一組精心選擇的數據結構和算法。后端是高度優化的,并且是為并行化而設置的。
本系列學習計劃有Blue同學作為發起人,主要以Open3D官方網站的教程為主進行翻譯與實踐的學習計劃。點云PCL公眾號作為免費的3D視覺,點云交流社區,期待有使用Open3D或者感興趣的小伙伴能夠加入我們的翻譯計劃,貢獻免費交流社區,為使用Open3D提供中文的使用教程。
將顏色映射到從深度相機重建的幾何形狀。由于彩色幀和深度幀不一定是完美對齊的,所以使用彩色圖像進行紋理映射的結果會導致一個模糊的彩色映射。Open3d提供了基于[Zhou2014]中的彩色映射優化算法。下面的教程將會提供彩色映射優化算法的示例。
輸入
下面的代碼讀取彩色和深度圖像對,并且生成 rgbd_image。注意convert_rgb_to_intensity標志位設置為 False。只是為了保留8-bit彩色通道而不是使用單通道浮點型圖像。
在應用彩色映射優化之前,最好先對RGBD圖像進行可視化。debug_mode選擇是否可視化RGBD圖像。
def sorted_alphanum(file_list_ordered):convert = lambda text: int(text) if text.isdigit() else textalphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]return sorted(file_list_ordered, key=alphanum_key)def get_file_list(path, extension=None):if extension is None:file_list = [path + f for f in os.listdir(path) if os.path.isfile(join(path, f))]else:file_list = [path + ffor f in os.listdir(path)if os.path.isfile(os.path.join(path, f)) and os.path.splitext(f)[1] == extension]file_list = sorted_alphanum(file_list)return file_list
path = o3dtut.download_fountain_dataset()
debug_mode = Falsergbd_images = []
depth_image_path = get_file_list(os.path.join(path, "depth/"),extension=".png")
color_image_path = get_file_list(os.path.join(path, "image/"),extension=".jpg")
assert (len(depth_image_path) == len(color_image_path))
for i in range(len(depth_image_path)):depth = o3d.io.read_image(os.path.join(depth_image_path[i]))color = o3d.io.read_image(os.path.join(color_image_path[i]))rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color, depth, convert_rgb_to_intensity=False)if debug_mode:pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image,o3d.camera.PinholeCameraIntrinsic(o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))o3d.visualization.draw_geometries([pcd])rgbd_images.append(rgbd_image)
下面的代碼讀取相機軌跡和網格數據
camera = o3d.io.read_pinhole_camera_trajectory(os.path.join(path, "scene/key.log"))
mesh = o3d.io.read_triangle_mesh(os.path.join(path, "scene", "integrated.ply"))
為了可視化出相機的姿態不適合顏色映射,下面的代碼故意設置迭代次數為0,也就是不對其映射做優化。color_map_optimization使用對應的相機姿態和RGBD圖像來繪制網格。如果沒有優化的話,可以看到紋理很模糊。
# Before full optimization, let's just visualize texture map
# with given geometry, RGBD images, and camera poses.
option = o3d.color_map.ColorMapOptimizationOption()
option.maximum_iteration = 0
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)
o3d.visualization.draw_geometries([mesh])
剛性優化
下一步優化相機參數來獲得清晰的彩色圖像。
下面的代碼設置最大迭代次數為300。
# Optimize texture and save the mesh as texture_mapped.ply
# This is implementation of following paper
# Q.-Y. Zhou and V. Koltun,
# Color Map Optimization for 3D Reconstruction with Consumer Depth Cameras,
# SIGGRAPH 2014
option.maximum_iteration = 100 if is_ci else 300
option.non_rigid_camera_coordinate = False
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)
o3d.visualization.draw_geometries([mesh])
殘差表示圖像強度不一致,殘差越低表示顏色映射質量越好。ColorMapOptimizationOption默認使用剛性優化,去優化相機的六維姿態。
非剛性優化
為了有一個更好的映射質量,需要使用非剛性優化。要啟用非剛性優化只需要在調用color_map_optimization前將option.non_rigid_camera_coordinate設置為True。除了六維相機姿態以外,非剛性優化甚至考慮了由錨點表示的局部圖像變形。這種方式更加靈活并且會有著更高的彩色映射質量。殘差也會小于剛性優化的情況。
option.maximum_iteration = 100 if is_ci else 300
option.non_rigid_camera_coordinate = True
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)
o3d.visualization.draw_geometries([mesh])
資源
三維點云論文及相關應用分享
【點云論文速讀】基于激光雷達的里程計及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学习计划—高级篇 7(颜色映射)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于相交线的立体平面SLAM
- 下一篇: 【论文速读】城市自动驾驶应用的概率语义地