亲测代码程序可运行使用,open3d版本0.13.0。
open3d数据资源下载:GitHub - Cobotic/Open3D: Open3D: A Modern Library for 3D Data Processing
代码执行功能有:读取相机内参、读取RGBD图像、从一对RGBD图像中计算里程、可视化RGBD图像对,详情请见代码。
'''
Author: dongcidaci
Date: 2021-09-12 19:33:29
LastEditTime: 2021-09-12 19:55:11
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \open3d\06——RGBDImage_test.py
'''
import open3d as o3d
import numpy as np
#RGBD测程法(RGBD Odometry)是去寻找两个RGBD图像之间的相机移动。
#他的输入是一对RGBImage的实例,输出是刚体变换形式的运动。
#读取相机内参(camera intrinsic)
#我们首先从json文件中读取相机内参。
pinhole_camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic("Open3D-master/examples/test_data/camera_primesense.json")
print(pinhole_camera_intrinsic.intrinsic_matrix)
#Open3d 中许多小的数据结构都能够通过json文件来读写。包括相机参数,相机轨迹,姿态图等等。
#读取RGBD图像
#这个代码块是读取两对Redwood格式的RGBD图像。
source_color = o3d.io.read_image("Open3D-master/examples/test_data/RGBD/color/00000.jpg")
source_depth = o3d.io.read_image("Open3D-master/examples/test_data/RGBD/depth/00000.png")
target_color = o3d.io.read_image("Open3D-master/examples/test_data/RGBD/color/00001.jpg")
target_depth = o3d.io.read_image("Open3D-master/examples/test_data/RGBD/depth/00001.png")
source_rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(source_color, source_depth)
target_rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(target_color, target_depth)
target_pcd = o3d.geometry.PointCloud.create_from_rgbd_image(target_rgbd_image, pinhole_camera_intrinsic)
#Open3d假设彩色图像和深度图像是同步的,并且在同一坐标系下配准。这通常可以在RGBD相机中通过打开同步和配准设置来实现。
#从一对RGBD图像中计算里程
option = o3d.pipelines.odometry.OdometryOption()
odo_init = np.identity(4)
print(option)
#去最小化对齐图片的颜色一致性
[success_color_term, trans_color_term, info] = o3d.pipelines.odometry.compute_rgbd_odometry(
source_rgbd_image, target_rgbd_image, pinhole_camera_intrinsic,
odo_init, o3d.pipelines.odometry.RGBDOdometryJacobianFromColorTerm(), option)
#除了颜色一致性以外,他还实现了几何约束
[success_hybrid_term, trans_hybrid_term, info] = o3d.pipelines.odometry.compute_rgbd_odometry(
source_rgbd_image, target_rgbd_image, pinhole_camera_intrinsic,
odo_init, o3d.pipelines.odometry.RGBDOdometryJacobianFromHybridTerm(), option)
#OdometryOption()有几个参数:
#1.minimum_correspondence_ratio:对齐后,测量两张RGBD图像的重叠比率。如果两组RGBD图像的重叠区域小于指定的比例,则测程模块会认为这是失效的情况。
#2.max_depth_diff:在深度图像中,如果两个对齐的像素的深度差异是小于一个值的,则认为它们是对应的。值越大,搜索越激进,但是结果越不容易稳定。
#3.min_depth 和 max_depth:大于或小于指定深度的像素会被忽略。
#可视化RGBD图像对
#将RGBD图像对转换成点云并且一起渲染。要注意的是,第一个(源)RGBD图像是通过测程法估计出的变换来进行变换的。经过变化之后的两组点云是对齐的。
if success_color_term:
print("Using RGB-D Odometry")
print(trans_color_term)
source_pcd_color_term = o3d.geometry.PointCloud.create_from_rgbd_image(
source_rgbd_image, pinhole_camera_intrinsic)
source_pcd_color_term.transform(trans_color_term)
o3d.visualization.draw_geometries([target_pcd, source_pcd_color_term])
if success_hybrid_term:
print("Using Hybrid RGB-D Odometry")
print(trans_hybrid_term)
source_pcd_hybrid_term = o3d.geometry.PointCloud.create_from_rgbd_image(
source_rgbd_image, pinhole_camera_intrinsic)
source_pcd_hybrid_term.transform(trans_hybrid_term)
o3d.visualization.draw_geometries([target_pcd, source_pcd_hybrid_term])