RGB,深度图,点云和体素的相互转换记录

目录

1.RGBD2Point

1.2 步骤

2.Point2Voxel-Voxelization

2.1 原理

2.2 代码

3.Voxel2Point

4.Point2RGB

5.Voxel2RGB


1.RGBD2Point

input:RGB + D + 内外惨

output:points cloud

def depth2pcd(depth_img):"""深度图转点云数据图像坐标系 -> 世界坐标系 :param depth_img: 深度图:return: 点云数据 N*3"""# 相机内参cam_fx = 1120.12cam_fy = 1120.12cam_cx = 640.5cam_cy = 360.5factor = 1# 逐点处理,此过程可以使用numpy优化m, n = depth_img.shapepoint_cloud = []for v in range(m):for u in range(n):if depth_img[v, u] == 0:continuedepth = depth_img[v, u]p_z = depth / factor                         z = 深度/焦距p_x = (u - cam_cx) * p_z / cam_fx                             p_y = (v - cam_cy) * p_z / cam_fypoint_cloud.append([p_x, p_y, p_z])          # 这里还可以添加RGB信息point_cloud = np.array(point_cloud)return point_cloud

1.2 步骤

RGBD数据转换为点云的过程通常包括以下步骤:

  1. 从深度图像中提取点云坐标:使用深度图像中的像素值计算每个像素在三维空间中的坐标。这可以通过将深度值转换为相机坐标系下的坐标来实现。 (X,Y,Z)

    1. 确定相机内参和外参:相机内参包括相机的焦距、主点和畸变参数等,用于将像素坐标转换为相机坐标系下的坐标。相机外参包括相机在世界坐标系下的位置和方向,用于将相机坐标系下的坐标转换为世界坐标系下的坐标。

    2. 将深度图像转换为点云坐标:对于每个像素,根据其深度值和相机内参,可以计算出其在相机坐标系下的坐标。然后,根据相机外参,可以将相机坐标系下的坐标转换为世界坐标系下的坐标。这样就可以得到每个像素对应的点云坐标。

    3. 去除无效点:深度图像中可能包含一些无效点,例如深度值为0或超出一定范围的点。这些点需要被去除,以保证点云的质量和准确性。

    4. 可选:对点云进行滤波和重采样:为了减少噪声和数据量,可以对点云进行滤波和重采样。例如,可以使用高斯滤波或中值滤波来平滑点云,或使用体素格化和统计滤波来降低点云的密度。

  2. 从RGB图像中提取点云颜色:使用RGB图像中的像素值提取每个点的颜色信息。这可以通过将RGB值与对应的点云坐标进行匹配来实现。 (X,Y, Z,R,G,B)

    1. 确定相机内参和外参:与从深度图像中提取点云坐标类似,从RGB图像中提取点云颜色也需要相机内参和外参的信息。

    2. 将RGB图像转换为点云颜色:对于每个点云坐标,可以使用相机内参和外参将其对应到RGB图像上的像素坐标。然后,可以从RGB图像中提取对应像素的颜色信息,例如RGB值或HSV值等。

    3. 可选:对颜色进行校正和增强:为了提高颜色的准确性和鲁棒性,可以对颜色进行校正和增强。例如,可以使用颜色校正矩阵来校正颜色偏差,或使用直方图均衡化和对比度增强来增强颜色对比度。

  3. 将点云坐标和颜色信息组合成点云:将每个点的坐标和颜色信息组合成一个点云。这可以通过将坐标和颜色信息存储在一个结构体或数组中来实现

2.Point2Voxel-Voxelization

2.1 原理

将点云数据转换为体素(voxel)通常需要进行以下步骤:

  1. 确定体素大小和边界:体素大小是指体素的边长,它决定了体素的分辨率和精度。边界是指点云数据的空间范围,它决定了体素的数量和大小。

  2. 将点云数据转换为体素坐标:对于每个点云坐标,可以根据体素大小将其对应到体素坐标系下的坐标。例如,可以将点云坐标除以体素大小并向下取整,以得到其对应的体素坐标

  3. 将点云数据分配到体素中:对于每个体素坐标,可以将其对应的点云数据分配到该体素中。例如,可以将该体素中所有点云数据的颜色或法向量进行平均或加权平均,以得到该体素的颜色或法向量信息。

  4. 可选:对体素进行滤波和重采样:为了减少噪声和数据量,可以对体素进行滤波和重采样。例如,可以使用高斯滤波或中值滤波来平滑体素,或使用体素格化和统计滤波来降低体素的密度。

转换后的体素数据可以用于各种计算机视觉和机器学习任务,例如三维重建、物体识别和姿态估计等。

2.2 代码

import numpy as np
from scipy.spatial import cKDTree
def pointcloud_to_voxel(pointcloud, voxel_size):# 计算体素边界和数量min_bound = np.min(pointcloud, axis=0)max_bound = np.max(pointcloud, axis=0)voxel_count = np.ceil((max_bound - min_bound) / voxel_size).astype(int)# 将点云数据转换为体素坐标voxel_coords = np.floor((pointcloud - min_bound) / voxel_size).astype(int)# 将点云数据分配到体素中voxel_data = np.zeros(voxel_count + 1)for i in range(len(pointcloud)):voxel_data[tuple(voxel_coords[i])] += 1# 可选:对体素进行滤波和重采样# ...return voxel_data

3.Voxel2Point

将3D体素数据转换为点云数据通常需要进行以下步骤:

以下是一个简单的Python代码示例,用于将点云数据转换为RGB图像:

  1. 确定体素大小和边界:体素大小是指体素的边长,它决定了体素的分辨率和精度。边界是指3D体素数据的空间范围,它决定了体素的数量和大小。

  2. 遍历体素数据,将非空体素转换为点云数据:对于每个非空体素,可以将其转换为一个或多个点云数据。例如,可以将该体素的中心点作为点云数据,或者将该体素中所有非空体素的中心点作为点云数据。

  3. 可选:对点云数据进行滤波和重采样:为了减少噪声和数据量,可以对点云数据进行滤波和重采样。例如,可以使用高斯滤波或中值滤波来平滑点云数据,或使用体素格化和统计滤波来降低点云数据的密度。

  4. import numpy as np
    def voxel_to_pointcloud(voxel_data, voxel_size):# 计算体素边界和数量min_bound = np.array([0, 0, 0])max_bound = np.array(voxel_data.shape) * voxel_size# 遍历体素数据,将非空体素转换为点云数据pointcloud = []for x in range(voxel_data.shape[0]):for y in range(voxel_data.shape[1]):for z in range(voxel_data.shape[2]):if voxel_data[x, y, z] > 0:pointcloud.append([x * voxel_size, y * voxel_size, z * voxel_size])# 可选:对点云数据进行滤波和重采样# ...return np.array(pointcloud)

    4.Point2RGB

    将点云数据转换为RGB图像通常需要进行以下步骤:

  5. 确定图像大小和分辨率:图像大小是指图像的宽度和高度,它决定了图像的分辨率和精度。分辨率是指图像中每个像素的大小,通常以像素/英寸(PPI)或像素/厘米(PPC)为单位。

  6. 将点云数据转换为图像坐标:对于每个点云坐标,可以根据图像大小和分辨率将其对应到图像坐标系下的坐标。例如,可以将点云坐标乘以分辨率并向下取整,以得到其对应的图像坐标。

  7. 将点云数据分配到图像中:对于每个图像坐标,可以将其对应的点云数据分配到该像素中。例如,可以将该像素中所有点云数据的颜色进行平均或加权平均,以得到该像素的颜色信息。

  8. 可选:对图像进行滤波和增强:为了减少噪声和提高图像质量,可以对图像进行滤波和增强。例如,可以使用高斯滤波或中值滤波来平滑图像,或使用直方图均衡化和对比度增强来增强图像对比度。

    import numpy as np
    import cv2
    def pointcloud_to_rgb(pointcloud, image_size, resolution):# 确定图像大小和分辨率image_width, image_height = image_sizepixel_size = 1 / resolution# 将点云数据转换为图像坐标image_coords = np.floor((pointcloud[:, :2] * resolution)).astype(int)# 将点云数据分配到图像中image_data = np.zeros((image_height, image_width, 3))for i in range(len(pointcloud)):x, y = image_coords[i]image_data[y, x] += pointcloud[i, 2:]# 可选:对图像进行滤波和增强# ...# 将图像数据转换为RGB图像image_data = (image_data / np.max(image_data) * 255).astype(np.uint8)rgb_image = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)# 可选:使用OpenCV显示图像cv2.imshow('RGB Image', rgb_image)cv2.waitKey(0)cv2.destroyAllWindows()return rgb_image

    5.Voxel2RGB

    将3D体素数据转换为2D图像通常需要进行以下步骤:

  9. 确定投影方向和投影平面:投影方向是指将3D体素数据投影到2D图像的方向,通常是x、y或z轴方向。投影平面是指投影方向所在的平面,通常是与另外两个轴垂直的平面。

  10. 将3D体素数据投影到2D图像:对于每个投影平面上的像素,可以将其对应到3D体素数据中的体素坐标。然后,可以根据投影方向和投影平面,将该体素沿着投影方向上的值投影到2D图像上的像素值中。例如,可以将该体素的最大值或平均值作为该像素的像素值。

  11. 可选:对2D图像进行滤波和增强:为了减少噪声和提高图像质量,可以对2D图像进行滤波和增强。例如,可以使用高斯滤波或中值滤波来平滑图像,或使用直方图均衡化和对比度增强来增强图像对比度。

  12. import numpy as np
    import cv2
    def voxel_to_image(voxel_data):# 确定投影方向和投影平面proj_axis = 2proj_plane = np.delete(np.arange(3), proj_axis)# 将3D体素数据投影到2D图像proj_data = np.max(voxel_data, axis=proj_axis)proj_data = np.transpose(proj_data, axes=proj_plane)# 可选:对2D图像进行滤波和增强# ...# 将2D图像转换为灰度图像proj_data = (proj_data / np.max(proj_data) * 255).astype(np.uint8)# 可选:使用OpenCV显示图像cv2.imshow('Projection', proj_data)cv2.waitKey(0)cv2.destroyAllWindows()return proj_data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发人才紧缺!这份《HarmonyOS教学视频》帮你更快上手鸿蒙

去年9月,华为宣布鸿蒙原生应用全面启动,基于开源鸿蒙开发的 HarmonyOS NEXT 鸿蒙星河版将在今年秋天正式和消费者见面。该版本系统底座将由华为全线自研,去掉传统安卓 AOSP 代码。 这意味着,鸿蒙星河版将不再兼容安卓应用&#xf…

47 vue 常见的几种模型视图不同步的问题

前言 这里主要是来看一下 关于 vue 中的一些场景下面 可能会出现 模型和视图 不同步更新的情况 然后 这种情况主要是 vue 中的对象 属性没有响应式的 setter, getter 然后 我们这里就来看一下 大多数的情况下的一个场景, 和一些处理方式 当然 处理方式主要是基于 Vue.set, …

Redis命令-Key的层级结构

基础篇Redis 4.4 Redis命令-Key的层级结构 Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢? 例如,需要存储用户.商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使…

你不知道的Python

Python,作为一种广泛使用的高级编程语言,因其易于学习和强大的库支持而受到开发者的青睐。尽管如此,Python 仍有许多鲜为人知的特性和技巧,这些隐藏的宝藏可以让编程工作变得更加高效和有趣。本文将揭示一些“你不知道的Python”特…

go发布包到github

1. 首先,我们在github上创建一个公有仓库并clone到本地 git clone https://github.com/kmust-why/gdmp-token.git cd gdmp-token/ 2. 在gdmp-token工程中初始化go.mod,其中后面的链接要跟github上创建的仓库和你的用户名对应 go mod init github.com…

OSPF GTSM(通用TTL安全保护机制)

目录 GTSM的定义 使用GTSM的目的 GTSM的原理 配置OSPF GTSM实例 组网需求 配置思路 操作步骤 1. 配置各接口的IP地址 2.配置OSPF基本功能 3.配置OSPF GTSM 4. 验证配置结果 GTSM的定义 GTSM(Generalized TTL Security Mechanism),…

linux安装Zookeeper的详细步骤

1.Java环境确认 确保已经安装了Java环境,没有的自行安装 2.官网下载包 Apache ZooKeeper 3.安装 3.1上传到linux,解压 我的目录为/root/apache-zookeeper-3.8.4-bin 进入到/root/apache-zookeeper-3.8.4-bin/conf目录下,执行命令复制zoo…

uniapp实现列表动态添加

1.效果图&#xff1a; 2.代码实现&#xff1a; 这里没有用uniapp提供的uni-list控件 <template> <view id"app"> <!-- 这里为了让标题&#xff08;h&#xff09;居中展示&#xff0c;给h标签设置了父标签&#xff0c;并设置父标签text-…

RK3568-开启ptp服务

硬件支持 mac或者phy需要支持ptp驱动支持 CONFIG_PTP_1588_CLOCK=y虚拟机端:虚拟机只支持软件时间戳。 安装ptp服务:sudo apt-get install linuxptpbuildroot系统-开发板端:开发板支持硬件时间戳和软件时间戳。 BR2_PACKAGE_LINUXPTP=y 编译相关ptp4l程序ubuntu系统-开发…

python实战之PyQt5桌面软件

一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接&#xff1a;https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码&#xff1a;ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…

【保姆级教程】YOLOv8自动数据标注

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple1.3 安装labelme标注工具 pip install labelme二、半自动标注…

buy me a btc 使用数字货币进行打赏赞助

最近在调研使用加密货币打赏的平台&#xff0c;发现idatariver平台 https://idatariver.com 推出的buymeabtc功能刚好符合使用场景&#xff0c;下图为平台的演示项目, 演示项目入口 https://buymeabtc.com/idatariver 特点 不少人都听说过buymeacoffee&#xff0c;可以在上面发…

upload-labs-master靶场训练笔记

2004.2.17 level-1 &#xff08;前端验证&#xff09; 新建一个写有下面一句话木马的php文件&#xff0c;然后把后缀改为png <?php eval($_POST["abc"]); ?> 用bp抓包后更改文件后缀为php 再用蚁剑等工具链接即可拿下shell level-2 &#xff08;后端…

中医面诊笔记

目录 面部五脏分区面部六腑分区眼袋大&#xff0c;黑的原因 面部色诊颧骨发红阴虚火旺为什么面部其它地方不发红而是颧骨发红&#xff1f; 人中 面部五脏分区 面部六腑分区 眼袋大&#xff0c;黑的原因 水湿重&#xff0c;比如眼袋大&#xff0c;眼袋黑&#xff0c;这是水湿过…

postgresql多选功能实现

一、背景介绍 在一所乡村小学&#xff0c;教师资源紧张&#xff0c;所以会出现一个教师身兼多职的情况&#xff0c;既是语文老师又是数学老师甚至还是体育老师&#xff0c;这个系统就是为各个班级分配老师&#xff0c;这样一个场景实现 二、代码实现及效果 后端country_teac…

深圳区块链交易所app系统开发,撮合交易系统开发

随着区块链技术的迅速发展和数字资产市场的蓬勃发展&#xff0c;区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中&#xff0c;区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

JAR 文件规范详解

介绍 JAR文件是基于ZIP文件格式的一种文件格式&#xff0c;用来将许多文件整合成一个文件。一个JAR文件本质上是包含可选目录META-INF的zip文件&#xff0c;可以通过命令行jar工具或者在Java平台上使用java.util.jar中的API来创建。JAR文件的命名没有严格的要求&#xff0c;可…

免费采集伪原创工具,采集伪原创软件

在内容创作领域&#xff0c;为了提高生产效率和节省时间&#xff0c;许多站长和网络写手会借助采集伪原创工具来生成大量文章。这些工具能够从网络上抓取内容&#xff0c;并通过一定的处理和修改&#xff0c;生成看起来与原始内容不同但意义相近的伪原创文章。以下将就采集伪原…

leetcode:392. 判断子序列

题目&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {} }; 题解&#xff1a; 很巧妙的题解&#xff1a;循环遍历两个字符串&#xff0c;两个字符串都没遍完就继续遍历&#xff0c;字符串s先遍历完结果为true&#xff0c;字符串t先遍历完结果为…

Elasticsearch 向量搜索

目标记录 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻","你好&#xff0c;我的病人","世界真美丽"] 搜索词 爱人 预期返回 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻"] 示例代码…