Open3D可视化连续点云帧(From KITTI tracking dataset)

  • 设置观看视角
  • 逐点上色
  • 可视化连续点云帧
#!/usr/bin/python3
# -*- coding: utf-8 -*- 

import os
import open3d as o3d
import numpy as np
import time


 
def save_view_point(pcd_numpy, filename):
    vis = o3d.visualization.Visualizer()
    vis.create_window()
    pcd = o3d.open3d.geometry.PointCloud()
    pcd.points= o3d.open3d.utility.Vector3dVector(pcd_numpy)
    vis.add_geometry(pcd)
    axis = o3d.geometry.TriangleMesh.create_coordinate_frame(size=1, origin=[0, 0, 0])
    vis.add_geometry(axis)
    vis.run()  # user changes the view and press "q" to terminate
    param = vis.get_view_control().convert_to_pinhole_camera_parameters()
    o3d.io.write_pinhole_camera_parameters(filename, param)
    vis.destroy_window()

def draw_color(color_h,color_l,pcd):
    color_h = np.array(color_h,np.float32).reshape(1,3)
    color_l = np.array(color_l,np.float32).reshape(1,3)
    
    raw_points = np.array(pcd.points).copy()
    hight = raw_points[:,2:]
    hight = np.clip(hight, -3, 1)
    colors = color_l + (hight - (-3)) * (color_h -  color_l)/4.0
    pcd.colors = o3d.utility.Vector3dVector(colors)
    return pcd

def vis_cons(files_dir,vis_detect_result=False):
    files = os.listdir(files_dir)
    pcds = []
    for f in files:
        pcd_path = os.path.join(files_dir,f)
        pcd=o3d.open3d.geometry.PointCloud()#创建点云对象
        raw_point = np.fromfile(pcd_path, dtype=np.float32).reshape(-1, 4)[:,:3]
        pcd.points= o3d.open3d.utility.Vector3dVector(raw_point)#将点云数据转换为Open3d可以直接使用的数据类型
        pcd = draw_color([1.0,0.36,0.2],[1.0,0.96,0.2],pcd)
        pcds.append(pcd)
    #if vis_detect_result:
    #    batch_results = np.load('batch_results.npy',allow_pickle=True)
    
    vis = o3d.visualization.Visualizer()
    vis.create_window()
    opt = vis.get_render_option()
    opt.background_color = np.asarray([0, 0, 0])
    opt.point_size = 1
    opt.show_coordinate_frame = False
    if os.path.exists("viewpoint.json"):
        ctr = vis.get_view_control()
        param = o3d.io.read_pinhole_camera_parameters("viewpoint.json")
        ctr.convert_from_pinhole_camera_parameters(param)

    for i in range(len(pcds)):
        vis.clear_geometries()
        axis = o3d.geometry.TriangleMesh.create_coordinate_frame(size=1, origin=[0, 0, 0])
        vis.add_geometry(axis)
        vis.add_geometry(pcds[i])
        ctr.convert_from_pinhole_camera_parameters(param)
        time.sleep(0.1)
        vis.run()
    vis.destroy_window()


if __name__ == '__main__':
    exp_pcd_file=r"F:\Datasets\PointCloud\KITTI_track\KITTI_tracking\training\velodyne\0001"
    view_pcd = np.fromfile(os.path.join(exp_pcd_file,'000000.bin'), dtype=np.float32).reshape(-1, 4)[:,:3]
    save_view_point(view_pcd, "viewpoint.json")
    vis_cons(exp_pcd_file)
### Open3D 点云可视化中的相机内参应用 在使用Open3D进行点云可视化并应用相机内参时,可以按照如下方式操作: 加载点云文件后,定义相机参数对象`PinholeCameraIntrinsic`来设置相机内参。对于KITTI数据集而言,其提供了四个不同摄像头的内参矩阵P0至P3,这些矩阵为尺寸3×4的投影矩阵[^3]。 下面是一个具体的Python代码实例展示如何读取点云以及设定和应用相机内参来进行渲染: ```python import open3d as o3d import numpy as np # 加载PLY格式的点云文件 pcd = o3d.io.read_point_cloud("point_cloud.ply") # 定义相机内部参数 (这里假设采用的是左侧彩色相机即P2作为例子) intrinsic_matrix = [[7.215377e+02, 0.000000e+00, 6.095593e+02], [0.000000e+00, 7.215377e+02, 1.728540e+02], [0.000000e+00, 0.000000e+00, 1.000000e+00]] camera_intrinsic = o3d.camera.PinholeCameraIntrinsic() camera_intrinsic.set_intrinsics(1242, 375, intrinsic_matrix[0][0], intrinsic_matrix[1][1], intrinsic_matrix[0][2], intrinsic_matrix[1][2]) # 创建虚拟摄像机轨迹用于固定视角查看 trajectory = o3d.camera.PinholeCameraTrajectory() parameters = o3d.camera.PinholeCameraParameters() # 设置外参(可以根据实际情况调整) extrinsic = np.eye(4) # 单位阵表示默认位置 parameters.extrinsic = extrinsic parameters.intrinsic = camera_intrinsic trajectory.parameters.append(parameters) # 显示带特定相机配置的结果 o3d.visualization.draw_geometries_with_animation_callback([pcd], lambda vis: vis.register_animation_callback( None)) ``` 此段代码展示了怎样通过给定的相机内参创建一个`PinholeCameraIntrinsic`对象,并将其应用于点云可视化的场景之中。注意这里的内在参数是基于KITTI数据集中左彩摄头(P2)的例子构建而成,在实际项目里应当依据具体使用的传感器型号来确定相应的数值。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值