躺躺11 2023-04-29 23:44 采纳率: 60%
浏览 105

点云 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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-01 12:34
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自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)
      

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


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

报告相同问题?

问题事件

  • 创建了问题 4月29日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示