首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Open3d中的非BLocking可视化

Open3d中的非BLocking可视化
EN

Stack Overflow用户
提问于 2020-10-20 09:43:15
回答 1查看 829关注 0票数 0

我有两个不同的点云存储在两个不同的numpy数组中,我可以在open3d中可视化它们的组合。但我想要做的是,一个点云保持不变,另一个在z方向上移动(即更新numpy数组的坐标),而不关闭窗口。

下面是我传递这两个numpy数组(npa和npa_test)以在open3d中可视化的代码。请注意,在最初的代码行中,我将numpy数组存储到.pcd文件中(因为它们是从open3d无法识别的不同类型的文件.asc中提取出来的),然后使用open3d读取函数读取它们。我想通过在z方向上移动一个点云geomtry来更新它,然后在同一个窗口上可视化它,而不是关闭它。这可以通过将z坐标更新1 in for循环来完成,如下所述。如果您对此有解决方案,请让我知道。谢谢。

def draw(npa,npa_test):

代码语言:javascript
运行
复制
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(npa)
o3d.io.write_point_cloud("C:/Users/Junaid/Desktop/test.ply", pcd)
pcd_load = o3d.io.read_point_cloud("C:/Users/Junaid/Desktop/test.ply")

pcd1 = o3d.geometry.PointCloud()
pcd1.points = o3d.utility.Vector3dVector(npa_test)
o3d.io.write_point_cloud("C:/Users/Junaid/Desktop/test1.ply", pcd1)
pcd_load1 = o3d.io.read_point_cloud("C:/Users/Junaid/Desktop/test1.ply")

o3d.utility.set_verbosity_level(o3d.utility.VerbosityLevel.Debug)

vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(pcd_load)
vis.add_geometry(pcd_load1)

npa.tolist()

for i in range(len(npa)):

    npa[i][2] = npa[i][2] + 1

    npa=np.asarray(npa, dtype=np.float32)
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(npa)
    o3d.io.write_point_cloud("C:/Users/Junaid/Desktop/test.ply", pcd)
    pcd_load = o3d.io.read_point_cloud("C:/Users/Junaid/Desktop/test.ply")

    vis.update_geometry(pcd_load)

    vis.poll_events()
    vis.update_renderer()
vis.destroy_window()
EN

Stack Overflow用户

发布于 2020-11-19 18:40:44

我看到您正在使用npa[i][2] = npa[i][2] + 1修改该值,当您仅使用Transformation Matrix来转换几何图形(如pcd.transform(np.array([[1,0,0,0],[0,1,0,0],[0,0,1,z_val],[0,0,0,1]])) )时,这就有点过分了。

以下是使用open3d将球体从z=0.5移动到15.0时增量为0.005的简单解决方案。

代码语言:javascript
运行
复制
import open3d as o3d
import numpy as np

def create_transform_matrix_from_z(z):
    """ Return transform 4x4 transformation matrix given a Z value """
    result = np.identity(4)
    result[2,3] = z # Change the z
    
    return result

# Create Open3d visualization window
vis = o3d.visualization.Visualizer()
vis.create_window()

# create sphere geometry
sphere1 = o3d.geometry.TriangleMesh.create_sphere()
vis.add_geometry(sphere1)

# create coordinate frame
coordinate_frame = o3d.geometry.TriangleMesh.create_coordinate_frame()
vis.add_geometry(coordinate_frame)

prev_tf = None
for curr_z in np.arange(0.5, 15.0, 0.005):
    # return sphere1 to original position (0,0,0)
    if prev_tf is not None:
        sphere1.transform(np.linalg.inv(prev_tf))

    # transform bazed on curr_z tf
    curr_tf = create_transform_matrix_from_z(curr_z)
    sphere1.transform(curr_tf)

    prev_tf = curr_tf

    vis.update_geometry(sphere1)
    vis.poll_events()
    vis.update_renderer()
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64437341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档