代码之家  ›  专栏  ›  技术社区  ›  Mona Jalal

从realsense API或Open3D库可视化点云

  •  0
  • Mona Jalal  · 技术社区  · 4 年前

    我有一个来自英特尔RealSense相机的深度帧,我想将其转换为点云并可视化点云。到目前为止,对于仅给定深度帧和相机内部函数来创建点云,我发现了以下两个函数,但我似乎找不到一种方法来可视化或将它们存储为 .ply 文件。

    我应该如何可视化这样制作的点云?

    方法1:

    pointcloud = convert_depth_frame_to_pointcloud(original_depth_frame, color_intrinsics)
    

    在哪儿 convert_depth_frame_to_pointcloud 是a helper function 来自RealSense。

    使用Open3D库的方法2:

    pcd = o3d.geometry.PointCloud.create_from_depth_image(original_depth_frame, color_intrinsics)
    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    print(np.asarray(pcd.points)[1, :])  
    o3d.visualization.draw_geometries([pcd])
    

    此外,在使用o3d时,我遇到了以下错误:

    create_from_depth_image(): incompatible function arguments. The following argument types are supported:
        1. (depth: open3d::geometry::Image, intrinsic: open3d.cuda.pybind.camera.PinholeCameraIntrinsic, extrinsic: numpy.ndarray[float64[4, 4]] = array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]]), depth_scale: float = 1000.0, depth_trunc: float = 1000.0, stride: int = 1, project_valid_depth_only: bool = True) -> open3d.cuda.pybind.geometry.PointCloud
    

    这里读取original_depth_frame:

    frame = cv2.imread(os.path.join(args.depth_input_dir, imgs_dir[frame_idx]), cv2.IMREAD_ANYDEPTH)
    

    其中一个深度图像如下:

    000248.png PNG 1280x720 1280x720+0+0 16-bit Grayscale Gray 567278B 0.000u 0:00.000
    

    其中color_intrinsics为:

    def set_intrinsics(intrinsics_dict):
        intrinsics = rs.intrinsics()
        intrinsics.width = intrinsics_dict['width']
        intrinsics.height = intrinsics_dict['height']
        intrinsics.ppx = intrinsics_dict['ppx']
        intrinsics.ppy = intrinsics_dict['ppy']
        intrinsics.fx = intrinsics_dict['fx']
        intrinsics.fy = intrinsics_dict['fy']
        intrinsics.model = intrinsics_dict['model']
        intrinsics.coeffs = intrinsics_dict['coeffs']
        return intrinsics
    color_intrinsics = set_intrinsics(camera['color_intrinsics'])
    
    

    如果我不使用opencv阅读深度图像,使用open3d我可以创建PNG格式的深度图像的点云(但是我需要在代码中这样做)。

    import open3d as o3d
    import matplotlib.pyplot as plt
    import numpy as np
    
    raw_depth = o3d.io.read_image('depth_images/000248.png')
    pcd = o3d.geometry.PointCloud.create_from_depth_image(raw_depth, 
    o3d.camera.PinholeCameraIntrinsic(
                                      o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
                                    , np.identity(4), depth_scale=1000.0, depth_trunc=1000.0)
    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    print(np.asarray(pcd.points)[1,:])
    o3d.visualization.draw_geometries([pcd])
    

    ^^上面的代码生成3D点云。

    0 回复  |  直到 4 年前
        1
  •  2
  •   Mona Jalal    4 年前

    您需要按照以下方式阅读您的图像:

    import open3d as o3d
    import matplotlib.pyplot as plt
    import numpy as np
    
    raw_depth = o3d.io.read_image('depth_images/000248.png')
    pcd = o3d.geometry.PointCloud.create_from_depth_image(raw_depth, 
    o3d.camera.PinholeCameraIntrinsic(
                                      o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
                                    , np.identity(4), depth_scale=1000.0, depth_trunc=1000.0)
    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    print(np.asarray(pcd.points)[1,:])
    o3d.visualization.draw_geometries([pcd])