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()
只有第一张图片能转换,其他的都是黑的
我可以为您提供以下解决方案:
首先,使用 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]
在 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)
请注意,此代码仅是示例。具体的相机参数需要根据您的实际需求进行调整。
在设置好相机参数后,您可以使用 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)
请注意,您需要根据您的实际需求对截图的深度缩放和截断进行调整。