日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Open3d学习计划—高级篇 4(多视角点云配准)

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Open3d学习计划—高级篇 4(多视角点云配准) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文為轉(zhuǎn)載文章,原創(chuàng)作者為blue同學(xué),可關(guān)注他的博客:https://blog.csdn.net/io569417668

?

Open3D是一個開源庫,支持快速開發(fā)和處理3D數(shù)據(jù)。Open3D在c++和Python中公開了一組精心選擇的數(shù)據(jù)結(jié)構(gòu)和算法。后端是高度優(yōu)化的,并且是為并行化而設(shè)置的。

本系列學(xué)習(xí)計劃有Blue同學(xué)作為發(fā)起人,主要以O(shè)pen3D官方網(wǎng)站的教程為主進行翻譯與實踐的學(xué)習(xí)計劃。點云PCL公眾號作為免費的3D視覺,點云交流社區(qū),期待有使用Open3D或者感興趣的小伙伴能夠加入我們的翻譯計劃,貢獻免費交流社區(qū),為使用Open3D提供中文的使用教程。

多視角配準(zhǔn)是在全局空間中對齊多個幾何形狀的過程。比較有代表性的是,輸入是一組幾何形狀Pi(可以是點云或者RGBD圖像)。輸出是一組剛性變換Ti,變換后的點云TiPi可以在全局空間中對齊。
Open3d通過姿態(tài)圖估計提供了多視角配準(zhǔn)的接口。具體的技術(shù)細(xì)節(jié)請參考[Choi2015].

輸入

教程代碼的第一部分是從三個文件中讀取三個點云數(shù)據(jù),這三個點云將被降采樣和可視化,可以看出他們?nèi)齻€是不對齊的。

def load_point_clouds(voxel_size=0.0):pcds = []for i in range(3):pcd = o3d.io.read_point_cloud("../../TestData/ICP/cloud_bin_%d.pcd" % i)pcd_down = pcd.voxel_down_sample(voxel_size=voxel_size)pcds.append(pcd_down)return pcds
voxel_size = 0.02
pcds_down = load_point_clouds(voxel_size)
o3d.visualization.draw_geometries(pcds_down)

姿態(tài)圖

姿態(tài)圖有兩個關(guān)鍵的基礎(chǔ):節(jié)點和邊。節(jié)點是與姿態(tài)矩陣i關(guān)聯(lián)的一組幾何體Pi,通過該矩陣能夠?qū)i轉(zhuǎn)換到全局空間。集和Ti是一組待優(yōu)化的未知的變量。


PoseGraph.nodes是PoseGraphNode的列表。我們設(shè)P0的空間是全局空間。因此T0是單位矩陣。其他的姿態(tài)矩陣通過累加相鄰節(jié)點之間的變換來初始化。相鄰節(jié)點通常都有著大規(guī)模的重疊并且能夠通過Point-to-plane ICP來配準(zhǔn)。

姿態(tài)圖的邊連接著兩個重疊的節(jié)點(幾何形狀)。每個邊都包含著能夠?qū)⒃磶缀蜳i 和目標(biāo)幾何Pj對齊的變換矩陣Ti,j。本教程使用Point-to-plane ICP來估計變換矩陣。在更復(fù)雜的情況中,成對的配準(zhǔn)問題一般是通過全局配準(zhǔn)來解決的。

[Choi2015]?觀察到,成對的配準(zhǔn)容易出錯。甚至錯誤的匹配會大于正確的匹配,因此,他們將姿態(tài)圖的邊分為兩類。Odometry edges連接著鄰域節(jié)點,使用局部配準(zhǔn)的方式比如ICP就可以對齊他們。Loop closure edges連接著非鄰域的節(jié)點。該對齊是通過不太可靠的全局配準(zhǔn)找到的。在Open3d中,這兩類邊緣通過PoseGraphEdge初始化程序中的uncertain參數(shù)來確定。

除了旋轉(zhuǎn)矩陣Ti以外,用戶也可以去設(shè)置每一條邊的信息矩陣Ai。如果是通過
get_information_matrix_from_point_clouds設(shè)置的信息矩陣Ai,那么姿態(tài)圖的邊的損失將以 line process weight 近似于兩組節(jié)點對應(yīng)點集的RMSE。有關(guān)詳細(xì)細(xì)節(jié)請參考[Choi2015]?和 the Redwood registration benchmark。

下面的腳本創(chuàng)造了具有三個節(jié)點和三個邊的姿態(tài)圖。這些邊里,兩個是odometry edges(uncertain = False),一個是loop closure edge(uncertain = True)。

def pairwise_registration(source, target):print("Apply point-to-plane ICP")icp_coarse = o3d.registration.registration_icp(source, target, max_correspondence_distance_coarse, np.identity(4),o3d.registration.TransformationEstimationPointToPlane())icp_fine = o3d.registration.registration_icp(source, target, max_correspondence_distance_fine,icp_coarse.transformation,o3d.registration.TransformationEstimationPointToPlane())transformation_icp = icp_fine.transformationinformation_icp = o3d.registration.get_information_matrix_from_point_clouds(source, target, max_correspondence_distance_fine,icp_fine.transformation)return transformation_icp, information_icpdef full_registration(pcds, max_correspondence_distance_coarse,max_correspondence_distance_fine):pose_graph = o3d.registration.PoseGraph()odometry = np.identity(4)pose_graph.nodes.append(o3d.registration.PoseGraphNode(odometry))n_pcds = len(pcds)for source_id in range(n_pcds):for target_id in range(source_id + 1, n_pcds):transformation_icp, information_icp = pairwise_registration(pcds[source_id], pcds[target_id])print("Build o3d.registration.PoseGraph")if target_id == source_id + 1:  # odometry caseodometry = np.dot(transformation_icp, odometry)pose_graph.nodes.append(o3d.registration.PoseGraphNode(np.linalg.inv(odometry)))pose_graph.edges.append(o3d.registration.PoseGraphEdge(source_id,target_id,transformation_icp,information_icp,uncertain=False))else:  # loop closure casepose_graph.edges.append(o3d.registration.PoseGraphEdge(source_id,target_id,transformation_icp,information_icp,uncertain=True))return pose_graphprint("Full registration ...")
max_correspondence_distance_coarse = voxel_size * 15
max_correspondence_distance_fine = voxel_size * 1.5
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:pose_graph = full_registration(pcds_down,max_correspondence_distance_coarse,max_correspondence_distance_fine)

Open3d使用函數(shù)global_optimization進行姿態(tài)圖估計,可以選擇兩種類型的優(yōu)化算法,分別是GlobalOptimizationGaussNewto

和GlobalOptimizationLevenbergMarquardt。比較推薦后一種的原因是因為它具有比較好的收斂性。GlobalOptimizationConvergenceCriteria類可以用來設(shè)置最大迭代次數(shù)和別的優(yōu)化參數(shù)。

GlobalOptimizationOption定于了兩個參數(shù)。max_correspondence_distance定義了對應(yīng)閾值。edge_prune_threshold是修剪異常邊緣的閾值。reference_node是被視為全局空間的節(jié)點ID。

print("Optimizing PoseGraph ...")
option = o3d.registration.GlobalOptimizationOption(max_correspondence_distance=max_correspondence_distance_fine,edge_prune_threshold=0.25,reference_node=0)
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.registration.global_optimization(pose_graph, o3d.registration.GlobalOptimizationLevenbergMarquardt(),o3d.registration.GlobalOptimizationConvergenceCriteria(), option)

全局優(yōu)化在姿態(tài)圖上執(zhí)行兩次。第一遍將考慮所有邊緣的情況優(yōu)化原始姿態(tài)圖的姿態(tài),并盡量區(qū)分不確定邊緣之間的錯誤對齊。這些錯誤對齊將會產(chǎn)生小的 line process weights,他們將會在第一遍被剔除。第二遍將會在沒有這些邊的情況下運行,產(chǎn)生更緊密地全局對齊效果。在這個例子中,所有的邊都將被考慮為真實的匹配,所以第二遍將會立即終止。

可視化操作

使用```draw_geometries``函數(shù)可視化變換點云。

print("Transform points and display")
for point_id in range(len(pcds_down)):print(pose_graph.nodes[point_id].pose)pcds_down[point_id].transform(pose_graph.nodes[point_id].pose)
o3d.visualization.draw_geometries(pcds_down)

Transform points and display
[[ 1.00000000e+00 -2.50509994e-19 0.00000000e+00 0.00000000e+00]
[-3.35636805e-20 1.00000000e+00 1.08420217e-19 -8.67361738e-19]
[-1.08420217e-19 -1.08420217e-19 1.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
[[ 0.8401689 -0.14645453 0.52217554 0.34785474]
[ 0.00617659 0.96536804 0.2608187 -0.39427149]
[-0.54228965 -0.2159065 0.81197679 1.7300472 ]
[ 0. 0. 0. 1. ]]
[[ 0.96271237 -0.07178412 0.2608293 0.3765243 ]
[-0.00196124 0.96227508 0.27207136 -0.48956598]
[-0.27051994 -0.26243801 0.92625334 1.29770817]
[ 0. 0. 0. 1. ]]

得到合并的點云

PointCloud是可以很方便的使用+來合并兩組點云成為一個整體。合并之后,將會使用voxel_down_sample進行重新采樣。建議在合并之后對點云進行后處理,因為這樣可以減少重復(fù)的點后者較為密集的點。

pcds = load_point_clouds(voxel_size)
pcd_combined = o3d.geometry.PointCloud()
for point_id in range(len(pcds)):pcds[point_id].transform(pose_graph.nodes[point_id].pose)pcd_combined += pcds[point_id]
pcd_combined_down = pcd_combined.voxel_down_sample(voxel_size=voxel_size)
o3d.io.write_point_cloud("multiway_registration.pcd", pcd_combined_down)
o3d.visualization.draw_geometries([pcd_combined_down])

盡管這個教程展示的點云的多視角配準(zhǔn),但是相同的處理步驟可以應(yīng)用于RGBD圖像,請參看 Make fragments 示例。

資源

三維點云論文及相關(guān)應(yīng)用分享

【點云論文速讀】基于激光雷達的里程計及3D點云地圖中的定位方法

3D目標(biāo)檢測:MV3D-Net

三維點云分割綜述(上)

3D-MiniNet: 從點云中學(xué)習(xí)2D表示以實現(xiàn)快速有效的3D LIDAR語義分割(2020)

win下使用QT添加VTK插件實現(xiàn)點云可視化GUI

JSNet:3D點云的聯(lián)合實例和語義分割

大場景三維點云的語義分割綜述

PCL中outofcore模塊---基于核外八叉樹的大規(guī)模點云的顯示

基于局部凹凸性進行目標(biāo)分割

基于三維卷積神經(jīng)網(wǎng)絡(luò)的點云標(biāo)記

點云的超體素(SuperVoxel)

基于超點圖的大規(guī)模點云分割

更多文章可查看:點云學(xué)習(xí)歷史文章大匯總

SLAM及AR相關(guān)分享

【開源方案共享】ORB-SLAM3開源啦!

【論文速讀】AVP-SLAM:自動泊車系統(tǒng)中的語義SLAM

【點云論文速讀】StructSLAM:結(jié)構(gòu)化線特征SLAM

SLAM和AR綜述

常用的3D深度相機

AR設(shè)備單目視覺慣導(dǎo)SLAM算法綜述與評價

SLAM綜述(4)激光與視覺融合SLAM

Kimera實時重建的語義SLAM系統(tǒng)

SLAM綜述(3)-視覺與慣導(dǎo),視覺與深度學(xué)習(xí)SLAM

易擴展的SLAM框架-OpenVSLAM

高翔:非結(jié)構(gòu)化道路激光SLAM中的挑戰(zhàn)

SLAM綜述之Lidar SLAM

基于魚眼相機的SLAM方法介紹

往期線上分享錄播匯總

第一期B站錄播之三維模型檢索技術(shù)

第二期B站錄播之深度學(xué)習(xí)在3D場景中的應(yīng)用

第三期B站錄播之CMake進階學(xué)習(xí)

第四期B站錄播之點云物體及六自由度姿態(tài)估計

第五期B站錄播之點云深度學(xué)習(xí)語義分割拓展

第六期B站錄播之Pointnetlk解讀

[線上分享錄播]點云配準(zhǔn)概述及其在激光SLAM中的應(yīng)用

[線上分享錄播]cloudcompare插件開發(fā)

[線上分享錄播]基于點云數(shù)據(jù)的?Mesh重建與處理

[線上分享錄播]機器人力反饋遙操作技術(shù)及機器人視覺分享

[線上分享錄播]地面點云配準(zhǔn)與機載點云航帶平差

點云PCL更多活動請查看:點云PCL活動之應(yīng)屆生校招群

掃描下方微信視頻號二維碼可查看最新研究成果及相關(guān)開源方案的演示:

如果你對Open3D感興趣,或者正在使用該開源方案,就請加入我們,一起翻譯,一起學(xué)習(xí),貢獻自己的力量,目前階段主要以微信群為主,有意者發(fā)送“Open3D學(xué)習(xí)計劃”到公眾號后臺,和更多熱愛分享的小伙伴一起交流吧!如果翻譯的有什么問題或者您有更好的意見,請評論交流!!!!

以上內(nèi)容如有錯誤請留言評論,歡迎指正交流。如有侵權(quán),請聯(lián)系刪除

掃描二維碼

? ? ? ? ? ? ? ? ? ?關(guān)注我們

讓我們一起分享一起學(xué)習(xí)吧!期待有想法,樂于分享的小伙伴加入免費星球注入愛分享的新鮮活力。分享的主題包含但不限于三維視覺,點云,高精地圖,自動駕駛,以及機器人等相關(guān)的領(lǐng)域。

分享及合作:微信“920177957”(需要按要求備注) 聯(lián)系郵箱:dianyunpcl@163.com,歡迎企業(yè)來聯(lián)系公眾號展開合作。

點一下“在看”你會更好看耶

總結(jié)

以上是生活随笔為你收集整理的Open3d学习计划—高级篇 4(多视角点云配准)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。