目录

核心思路

保存视图

加载视图

重写draw_geometries

调用示例

保存视角

绘制


open3d高级API,调用函数即可精确控制初始化点云或网格显示的旋转和移动的视角,代码是封装好的函数,直接调用即可!!

核心思路

  • 从param = vis.get_view_control().convert_to_pinhole_camera_parameters()获取当前参数:实际上是一个4*4齐次坐标变换矩阵,描述物体的旋转和移动
  • 构造自己的旋转矩阵:rot=Rot.from_euler('x', 90, degrees=True).as_matrix()
  • 构造自己的平移矩阵,使pcd中心移动到窗口中心:T=-np.dot(rot,pcd.get_center())
  • 根据试验,对T的参数进行修改,使之符合你的要求
  • 写入参数,写入json

保存视图(封装好的函数直接调用即可)

'''绘图并保存视角文件'''
def draw_and_save_view_point(pcds_list, filename, width=800, height=800,left=100,top=100,window_name='view_point'):
    vis = o3d.visualization.Visualizer()
    vis.create_window(window_name=window_name, width=width, height=height,left=left,top=top)
    for pcd in pcds_list:
        vis.add_geometry(pcd)
    # vis.run()  # user changes the view and press "q" to terminate
    param = vis.get_view_control().convert_to_pinhole_camera_parameters()
    print(param.extrinsic)
    # view_extrinsic=param.extrinsic
    '''param.extrinsic
    [[   1.            0.            0.         -220.62903351]
     [  -0.           -1.           -0.            4.43547029]
     [  -0.           -0.           -1.          -30.20751378]
     [   0.            0.            0.            1.        ]]
    '''
    #construction of the view_extrinsic
    pose = np.eye(4)
    #!!!1st row is the rotation, 2nd row is the translation!!
    rot=Rot.from_euler('x', 90, degrees=True).as_matrix()
    T=-np.dot(rot,pcd.get_center())
    # print(f'rot:{rot}')
    # print(f'T:{T}')
    T[0]=T[0]-5#控制在屏幕左右位置
    T[1]=T[1]+4#控制在屏幕上下的位置,越大越靠下
    T[2]=T[2]+10#控制景深
    pose[:3, :3] = rot
    pose[:3, 3] =T
    param.extrinsic = pose
    
    print(f'pose:{pose}')
    #perform the transformation
    vis.get_view_control().convert_from_pinhole_camera_parameters(param)
    #getthe current view
    param = vis.get_view_control().convert_to_pinhole_camera_parameters()
    vis.run()
    # save the view
    o3d.io.write_pinhole_camera_parameters(filename, param)
    print(f'param:{param}')
    vis.destroy_window()
        

加载视图(封装好的函数直接调用即可)

def load_view_point(pcds_list, window_name='pcd', width=800, height=800, left=100,top=100,filename="viewpoint.json"):
    '''o3d.visualization.draw_geometries(pcd_full_defect+pcd_half_defect+pcd_false+pcd_text,
                                  width=800,
                                  height=800,
                                  window_name='DBSCAN Clustering foreground')
'''
    vis = o3d.visualization.Visualizer()
    vis.create_window(window_name=window_name, width=width, height=height,left=left,top=top)
    ctr = vis.get_view_control()
    param = o3d.io.read_pinhole_camera_parameters(filename)
    for pcd in pcds_list:
        vis.add_geometry(pcd)
    ctr.convert_from_pinhole_camera_parameters(param)
    vis.run()
    vis.destroy_window()

重写draw_geometries(封装好的函数直接调用即可)

o3d.visualization.draw_geometries=load_view_point # 将函数赋值给draw_geometries

调用示例

先保存视角

draw_and_save_view_point([pcd,mesh_frame], "viewpoint.json",window_name=fname_end)  #保存好得json文件位置

再次显示时会自动调用保存的json文件

o3d.visualization.draw_geometries([pcd_fg_dbscan,pcd_bg],window_name=f'{fname_end} Unsupervised Clustering foreground')

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐