点云 open3d 相机参数设置

open3d 相机参数重设

目的:批量读取文件内的点云文件,转到主视角方向,并截图

遇到问题:[Open3D WARNING] GLFW Error: The GLFW library is not initialized
应该是相机参数重设的问题。

代码:

import open3d as o3d
import numpy as np
import os
import glob

dir_path = r'./rec/*'
rec_files = [file for file in glob.iglob(dir_path)]
for i in range(len(rec_files)):
    pcd = o3d.io.read_point_cloud(rec_files[i])
    pcd.estimate_normals()
    centroid = pcd.get_center()
    points = np.asarray(pcd.points) - centroid
    cov = np.cov(points.T)
    eigenvalues, eigenvectors = np.linalg.eig(cov)
    idx = eigenvalues.argsort()[::-1]  
    eigenvalues = eigenvalues[idx]
    eigenvectors = eigenvectors[:, idx]
    main_direction = eigenvectors[:, 0]
    vis = o3d.visualization.Visualizer()
    vis.create_window(width=400,
                      height=400,
                      left=10,
                      top=10
                      )
    vis.update_geometry(pcd)
    vis.add_geometry(pcd)
    vis.get_render_option().point_size = 2
    vis.get_render_option().show_coordinate_frame = False
    vis.get_view_control().set_front(main_direction)
    view_control = vis.get_view_control()
    view_control.set_zoom(1.2)
    vis.capture_screen_image(f"./rec/rec_{i}.png", do_render=True)
    vis.update_geometry(pcd)
    vis.reset_view_point(True)
    vis.poll_events()
    vis.update_renderer()
    vis.destroy_window()

只有第一张图片能转换,其他的都是黑的

img

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我可以为您提供以下解决方案:

    1. 点云读取

    首先,使用 open3d 库读取点云数据非常简单。您可以使用以下代码行来读取单个点云数据:

    import open3d as o3d
    
    # 读取单张点云数据
    pcd = o3d.io.read_point_cloud("your_point_cloud_file.pcd")
    

    如果您希望一次性读取多个点云文件,可以使用以下代码实现:

    import os
    
    import open3d as o3d
    
    # 指定点云存放的文件夹路径
    point_cloud_folder = "your_point_cloud_folder"
    
    # 获取文件夹下的所有文件
    point_cloud_files = [os.path.join(point_cloud_folder, f) for f in os.listdir(point_cloud_folder)]
    
    # 读取所有点云数据
    point_clouds = [o3d.io.read_point_cloud(f) for f in point_cloud_files]
    
    1. 设置相机参数

    在 open3d 中,可以通过创建一个 PinholeCameraIntrinsic 类型的对象来设置相机参数。下面是一个示例代码:

    import open3d as o3d
    
    # 创建 PinholeCameraIntrinsic 对象
    width = 1280
    height = 720
    fov = 60
    intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fov, fov, width/2, height/2)
    
    # 将该相机参数设置到点云对象中
    pcd = o3d.io.read_point_cloud("your_point_cloud_file.pcd")
    pcd.transform(intrinsics.intrinsic_matrix)
    

    请注意,此代码仅是示例。具体的相机参数需要根据您的实际需求进行调整。

    1. 点云转换和截图

    在设置好相机参数后,您可以使用 open3d 库中的 create_mesh_coordinate_frame() 函数将点云转换为主视角方向,如下所示:

    import open3d as o3d
    
    # 创建 PinholeCameraIntrinsic 对象并设置到点云中
    width = 1280
    height = 720
    fov = 60
    intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fov, fov, width/2, height/2)
    pcd = o3d.io.read_point_cloud("your_point_cloud_file.pcd")
    pcd.transform(intrinsics.intrinsic_matrix)
    
    # 将点云转换为主视角方向
    coord_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.6)
    pcd.transform([1, 0, 0, 0, -1, 0, 0, 0, -1])
    pcd.paint_uniform_color([0.5, 0.5, 0.5])
    o3d.visualization.draw_geometries([pcd, coord_frame])
    

    一旦点云已经被转换为主视角方向,您可以使用 write_image() 函数将点云截取成一张图片:

    import open3d as o3d
    
    # 创建 PinholeCameraIntrinsic 对象并设置到点云中
    width = 1280
    height = 720
    fov = 60
    intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fov, fov, width/2, height/2)
    pcd = o3d.io.read_point_cloud("your_point_cloud_file.pcd")
    pcd.transform(intrinsics.intrinsic_matrix)
    
    # 将点云转换为主视角方向
    pcd.transform([1, 0, 0, 0, -1, 0, 0, 0, -1])
    
    # 将点云截取为一张图片
    im = o3d.geometry.Image.create_from_depth_image(pcd, depth_scale=1000.0, depth_trunc=1000.0, convert_rgb_to_intensity=False)
    o3d.io.write_image("your_image_file.png", im)
    

    请注意,您需要根据您的实际需求对截图的深度缩放和截断进行调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^