open3d高级API精确控制旋转和移动的视角
·
目录
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')
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)