当前位置:网站首页>open3d学习笔记五【RGBD融合】
open3d学习笔记五【RGBD融合】
2022-07-02 06:26:00 【寂云萧】
1.RGB图像+深度图像融合
先建立RGBD图像。
depth = o3d.io.read_image("path/to/depth.jpg")
color = o3d.io.read_image("path/to/color.jpg")
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color, depth, depth_trunc=4.0, convert_rgb_to_intensity=False)
根据RGBD图像以及相机内参生成点云数据
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image,
# 输入open3d能识别的相机内参,如果用自己的相机,则需要先做内参的转换
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.
PrimeSenseDefault))
# 把生成的点云显示出来
o3d.visualization.draw_geometries([pcd])
2.RGBD融合
首先需要准备相机轨迹,文件名后缀.log
0 0 1
1.00000000 -0.00000000 -0.00000000 -0.00000000
-0.00000000 1.00000000 0.00000000 -0.00000000
0.00000000 -0.00000000 1.00000000 0.00000000
0.00000000 0.00000000 0.00000000 1.00000000
1 1 2
0.99999139 -0.00001393 0.00415030 0.00118646
-0.00003622 0.99992698 0.01208406 -0.02351636
-0.00415016 -0.01208411 0.99991837 -0.00144057
0.00000000 0.00000000 0.00000000 1.00000000
使用以下函数读取
class CameraPose:
def __init__(self, meta, mat):
self.metadata = meta
self.pose = mat
def __str__(self):
return 'Metadata : ' + ' '.join(map(str, self.metadata)) + '\n' + \
"Pose : " + "\n" + np.array_str(self.pose)
def read_trajectory(filename):
traj = []
with open(filename, 'r') as f:
metastr = f.readline()
while metastr:
metadata = list(map(int, metastr.split()))
mat = np.zeros(shape=(4, 4))
for i in range(4):
matstr = f.readline()
mat[i, :] = np.fromstring(matstr, dtype=float, sep=' \t')
traj.append(CameraPose(metadata, mat))
metastr = f.readline()
return traj
读取图片文件函数
def sorted_alphanum(file_list_ordered):
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(file_list_ordered, key=alphanum_key)
def get_file_list(path, extension=None):
if extension is None:
file_list = [path + f for f in os.listdir(path) if os.path.isfile(join(path, f))]
else:
file_list = [
path + f
for f in os.listdir(path)
if os.path.isfile(os.path.join(path, f)) and os.path.splitext(f)[1] == extension
]
file_list = sorted_alphanum(file_list)
return file_list
RGBD重建
数据集可以从github中获取,open3d_downloads。
def load_point_clouds(volume, voxel_size=0.0,debug_mode = True):
path = "mode/livingroom1_clean_micro/"
rgbd_images = []
pcds = []
depth_image_path = get_file_list(os.path.join(path, "depth/"),
extension=".png")
color_image_path = get_file_list(os.path.join(path, "image/"),
extension=".jpg")
assert (len(depth_image_path) == len(color_image_path))
for i in range(len(depth_image_path)):
depth = o3d.io.read_image(os.path.join(depth_image_path[i]))
color = o3d.io.read_image(os.path.join(color_image_path[i]))
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color, depth, depth_trunc=4.0, convert_rgb_to_intensity=False)
if debug_mode:
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.
PrimeSenseDefault))
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
pcd_down = pcd.voxel_down_sample(voxel_size=voxel_size)
o3d.visualization.draw_geometries([pcd_down])
pcds.append(pcd_down)
else:
camera_poses = read_trajectory("mode\\livingroom1_clean_micro\\test_scene\\trajectory.log")
volume.integrate(rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault),
np.linalg.inv(camera_poses[i].pose))
rgbd_images.append(rgbd_image)
if debug_mode:
return pcds
else:
return volume
3.整体代码
数据集一共210张,全部读取。
下面开始调用以上函数,生成融合后的点云图。注意图片有点多,所需时间较久。
from ntpath import join
import open3d as o3d
import numpy as np
import os
import re
# 相机轨迹
class CameraPose:
def __init__(self, meta, mat):
self.metadata = meta
self.pose = mat
def __str__(self):
return 'Metadata : ' + ' '.join(map(str, self.metadata)) + '\n' + \
"Pose : " + "\n" + np.array_str(self.pose)
def read_trajectory(filename):
traj = []
with open(filename, 'r') as f:
metastr = f.readline()
while metastr:
metadata = list(map(int, metastr.split()))
mat = np.zeros(shape=(4, 4))
for i in range(4):
matstr = f.readline()
mat[i, :] = np.fromstring(matstr, dtype=float, sep=' \t')
traj.append(CameraPose(metadata, mat))
metastr = f.readline()
return traj
# 读取图片文件
def sorted_alphanum(file_list_ordered):
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(file_list_ordered, key=alphanum_key)
def get_file_list(path, extension=None):
if extension is None:
file_list = [path + f for f in os.listdir(path) if os.path.isfile(join(path, f))]
else:
file_list = [
path + f
for f in os.listdir(path)
if os.path.isfile(os.path.join(path, f)) and os.path.splitext(f)[1] == extension
]
file_list = sorted_alphanum(file_list)
return file_list
# RGBD重建
def load_point_clouds(volume, voxel_size=0.0,debug_mode = True):
path = "mode/livingroom1_clean_micro/"
rgbd_images = []
pcds = []
depth_image_path = get_file_list(os.path.join(path, "depth/"),
extension=".png")
color_image_path = get_file_list(os.path.join(path, "image/"),
extension=".jpg")
assert (len(depth_image_path) == len(color_image_path))
for i in range(len(depth_image_path)):
# for i in range(4):
depth = o3d.io.read_image(os.path.join(depth_image_path[i]))
color = o3d.io.read_image(os.path.join(color_image_path[i]))
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color, depth, depth_trunc=4.0, convert_rgb_to_intensity=False)
if debug_mode:
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.
PrimeSenseDefault))
pcd.transform([[-1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
pcd_down = pcd.voxel_down_sample(voxel_size=voxel_size)
o3d.visualization.draw_geometries([pcd_down])
pcds.append(pcd_down)
else:
camera_poses = read_trajectory("mode\\livingroom1_clean_micro\\test_scene\\trajectory.log")
volume.integrate(rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault),
np.linalg.inv(camera_poses[i].pose))
rgbd_images.append(rgbd_image)
if debug_mode:
return pcds
else:
return volume
from time import time
start_time = time()
volume = o3d.pipelines.integration.ScalableTSDFVolume(
voxel_length=4.0 / 512.0,
sdf_trunc=0.04,
color_type=o3d.pipelines.integration.TSDFVolumeColorType.RGB8)
voxel_size = 0.02
debug_mode=False
pcds_down = load_point_clouds(volume, voxel_size, debug_mode=debug_mode)
if not debug_mode:
mesh = pcds_down.extract_triangle_mesh()
mesh.compute_vertex_normals()
mesh.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
print("花费时间:", time() - start_time)
o3d.visualization.draw_geometries([mesh])
边栏推荐
- 传统目标检测笔记1__ Viola Jones
- 机器学习理论学习:感知机
- What if the laptop task manager is gray and unavailable
- Drawing mechanism of view (3)
- 图片数据爬取工具Image-Downloader的安装和使用
- 点云数据理解(PointNet实现第3步)
- 【Hide-and-Seek】《Hide-and-Seek: A Data Augmentation Technique for Weakly-Supervised Localization xxx》
- 基于onnxruntime的YOLOv5单张图片检测实现
- 论文写作tip2
- [medical] participants to medical ontologies: Content Selection for Clinical Abstract Summarization
猜你喜欢
[CVPR‘22 Oral2] TAN: Temporal Alignment Networks for Long-term Video
Point cloud data understanding (step 3 of pointnet Implementation)
[paper introduction] r-drop: regulated dropout for neural networks
【AutoAugment】《AutoAugment:Learning Augmentation Policies from Data》
自然辩证辨析题整理
ModuleNotFoundError: No module named ‘pytest‘
【Programming】
Deep learning classification Optimization Practice
【FastDepth】《FastDepth:Fast Monocular Depth Estimation on Embedded Systems》
Installation and use of image data crawling tool Image Downloader
随机推荐
【Programming】
win10+vs2017+denseflow编译
[tricks] whiteningbert: an easy unsupervised sentence embedding approach
【多模态】CLIP模型
Conversion of numerical amount into capital figures in PHP
A slide with two tables will help you quickly understand the target detection
【Cascade FPD】《Deep Convolutional Network Cascade for Facial Point Detection》
自然辩证辨析题整理
Regular expressions in MySQL
【TCDCN】《Facial landmark detection by deep multi-task learning》
Pointnet understanding (step 4 of pointnet Implementation)
Play online games with mame32k
conda常用命令
【MEDICAL】Attend to Medical Ontologies: Content Selection for Clinical Abstractive Summarization
Implementation of yolov5 single image detection based on onnxruntime
Thesis writing tip2
点云数据理解(PointNet实现第3步)
Get the uppercase initials of Chinese Pinyin in PHP
常见CNN网络创新点
PHP returns the abbreviation of the month according to the numerical month