点云配准保存-open3d

您好,很抱歉一直打扰您,我是在open3d交互化窗口那里,使用点对点ICP配准,我在末尾加上了这个 draw_registration_result(source,target,reg_p2p.transformation)
o3d.io.write_point_cloud("tran2.ply",source.transform(reg_p2p.transformation))
但是输出的好像只是source的点云,如果是拼接后的点云保存,写什么啊,麻烦您了

img

要保存拼接后的点云,我们需要先将source和target两个点云拼接在一起。可以通过使用open3d中的concatenate_points函数来实现。具体做法如下:

1.将source点云和经过配准后的target点云进行拼接

import open3d as o3d

# 加载source点云和target点云
source = o3d.io.read_point_cloud("source.ply")
target = o3d.io.read_point_cloud("target.ply")

# 对source点云和target点云进行配准
reg_p2p = o3d.registration.registration_icp(source, target, max_correspondence_distance=0.05)

# 将source点云和配准后的target点云进行拼接
transformed_source = source.transform(reg_p2p.transformation)
concatenated_pc = transformed_source + target


2.保存拼接后的点云

# 将拼接后的点云保存为ply文件
o3d.io.write_point_cloud("concatenated_pc.ply", concatenated_pc)


完整代码实现如下:

import open3d as o3d

# 加载source点云和target点云
source = o3d.io.read_point_cloud("source.ply")
target = o3d.io.read_point_cloud("target.ply")

# 对source点云和target点云进行配准
reg_p2p = o3d.registration.registration_icp(source, target, max_correspondence_distance=0.05)

# 将source点云和配准后的target点云进行拼接
transformed_source = source.transform(reg_p2p.transformation)
concatenated_pc = transformed_source + target

# 将拼接后的点云保存为ply文件
o3d.io.write_point_cloud("concatenated_pc.ply", concatenated_pc)


希望以上代码能对您有所帮助。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
不用抱歉,我很乐意帮助你解决问题。你的代码中的问题在于你只是保存了 source 的点云,但是并没有将目标点云target与变换后的source合并在一起。

以下是一个完整的示例代码:

import open3d as o3d

# 读取目标点云和源点云
source = o3d.io.read_point_cloud("source.ply")
target = o3d.io.read_point_cloud("target.ply")

# 进行点对点ICP配准
threshold = 0.02
trans_init = np.identity(4)
reg_p2p = o3d.registration.registration_icp(
    source, target, threshold, trans_init,
    o3d.registration.TransformationEstimationPointToPoint(),
    o3d.registration.ICPConvergenceCriteria(max_iteration=200))

# 将配准后的源点云变换并叠加到目标点云上
source.transform(reg_p2p.transformation)
result = target + source

# 可视化
o3d.visualization.draw_geometries([result])

# 保存结果
o3d.io.write_point_cloud("result.ply", result)

你可以通过修改最后一行的代码来指定输出文件名。

希望能帮到你,如果还有其他问题可以随时问我。
如果我的回答解决了您的问题,请采纳!

内容来源与ChatGpt4及newbing和百度:


您可以使用以下代码将配准后的点云保存为ply文件:

import open3d as o3d

# 加载源点云和目标点云
source = o3d.io.read_point_cloud("source.ply")
target = o3d.io.read_point_cloud("target.ply")

# 点对点ICP配准
reg_p2p = o3d.registration.registration_icp(source, target, max_correspondence_distance=0.05)

# 将配准后的点云保存为ply文件
o3d.io.write_point_cloud("output.ply", reg_p2p.transform(source))

其中,source.plytarget.ply是待配准的源点云和目标点云的文件路径,output.ply是保存配准后的点云的文件路径。您可以根据实际情况修改文件路径。

另外,如果您想在配准后可视化结果,可以使用以下代码:

import open3d as o3d

# 加载源点云和目标点云
source = o3d.io.read_point_cloud("source.ply")
target = o3d.io.read_point_cloud("target.ply")

# 点对点ICP配准
reg_p2p = o3d.registration.registration_icp(source, target, max_correspondence_distance=0.05)

# 可视化配准结果
o3d.visualization.draw_geometries([source, target.transform(reg_p2p.transformation)])

这里使用transform方法将源点云变换到目标点云的坐标系下,并可视化变换后的源点云和目标点云。


祝您问题迎刃而解