百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

RGBD图像转3D点云

ztj100 2024-12-12 16:15 9 浏览 0 评论

推荐:用 NSDT编辑器 快速搭建可编程3D场景

在图像处理和计算机视觉领域,RGBD 是指结合图像颜色和深度信息的数据格式。文本介绍如何使用Python将RGBD数据转换为3D点云,可以使用NSDT 3DConvert在线查看3D点云或者进行格式转换:

1、RGBD = 颜色+深度

缩写 RGB 代表三基色通道,每个通道由 0 到 255 之间的整数值表示。这些值决定相应颜色的强度,0 表示没有颜色,255 表示最大强度。 第一个值代表红色通道,第二个值代表绿色,第三个值代表蓝色。 当任何 RGB 值增加时,颜色特征会向该特定颜色通道收敛。 为了说明这一点,请考虑以下示例。

(RGB)           -> color

(0, 0, 0)       -> black
(255, 0, 0)     -> red
(0, 255, 0)     -> green
(0, 0, 255)     -> blue 
(255, 255, 255) -> white

缩写词 RGBD 的最后一个字母代表深度通道。 该值提供图像的距离信息。 深度值可以通过多种技术获得,例如飞行时间 (ToF) 传感器、结构光传感器或立体相机设置。 这些传感器通过测量光或电磁波从传感器传播到物体并返回所需的时间来计算深度值。

2、3D 点云

3D 点云是一种基本数据结构,由三维笛卡尔坐标系中的一组数据点组成,其中云中的每个单独点对应于 3D 空间中的唯一位置,由其 x、y 和 z 精确定义 坐标。 点云是各种软件行业的关键实体,包括计算机视觉、机器人、地理信息系统 (GIS) 和 3D 建模。

3、从 RGBD图像创建 3D 点云

要从 2D 图像创建 3D 点云,焦距和基点的知识至关重要。 为此,给出相机矩阵作为输入。

下面的块显示了标准针孔相机的相机矩阵。

                    | fx   0  cx |
 Camera Matrix =    |  0  fy  cy |
                    |  0   0   1 |

其中各参数含义如下:

  • fx:表示沿x轴的焦距。
  • fy:表示沿 y 轴的焦距。
  • cx:表示基点的x坐标,它是图像平面沿 x 轴的中心。
  • cy:表示基点的y坐标,它是图像平面沿 y 轴的中心。

注意:

  • 右下角元素代表比例因子,通常设置为 1。
  • 其他元素表明相机的透视投影,不涉及水平 (x) 和垂直 (y) 轴之间的任何扭曲或倾斜效应。

当提供 RGBD 二维图像和标准针孔相机的相机矩阵时,可以使用基本数学原理来构建三维点云。

根据上图, f(焦距)由相机矩阵给出, y(像素的y坐标)可以通过枚举像素来计算, z(深度)就是深度值。 必须计算 Y才能创建 3D 点云。 通过使用三角形相似性, Y = y * z / f。 此说明仅针对 y坐标, x坐标可以用相同的公式获得。

下面的函数实现了上述步骤。

def to_3D(fx, fy, depth, cx, cy, u, v):
    x = (u-cx)*depth/fx
    y = (v-cy)*depth/fy
    z = depth
    x = np.expand_dims(x, axis = -1)
    y = np.expand_dims(y, axis = -1)
    z = np.expand_dims(z, axis = -1)
    return np.concatenate((x,y,z), axis=-1)

在上面的函数中, u和 v参数代表像素的 xy坐标。 为了说明这些参数,请考虑以下的数据,其中的值是使用具有 640 像素列和 480 像素行的图像创建的。

the shape of u = (480, 640)

the shape of v = (480, 640)

u = 

[[  0   1   2 ... 637 638 639]
 [  0   1   2 ... 637 638 639]
 [  0   1   2 ... 637 638 639]
 ...
 [  0   1   2 ... 637 638 639]
 [  0   1   2 ... 637 638 639]
 [  0   1   2 ... 637 638 639]]

v = 

[[  0   0   0 ...   0   0   0]
 [  1   1   1 ...   1   1   1]
 [  2   2   2 ...   2   2   2]
 ...
 [477 477 477 ... 477 477 477]
 [478 478 478 ... 478 478 478]
 [479 479 479 ... 479 479 479]]

最后,可以使用以下函数创建 3D 点云。

def make_point_cloud(datapath, fx, fy, cx, cy):
    rgbd = .....\load data
    H = len(rgbd)
    W = len(rgbd[0])
    u = np.arange(W)
    v = np.arange(H)
    u, v = np.meshgrid(u, v)
    xyz = to_3D(fx, fy, rgbd[:,:,3], cx, cy, u, v)
    rgb = rgbd[:,:,:-1]
    point_cloud = np.concatenate((xyz, rgb), axis=-1)
    return point_cloud

4、RGBD转3D点云示例

输入RGB图像和深度图像如下:

左:RGB图像 右:深度图像

利用前面的函数,我们得到的3D点云如下所示:


原文链接:http://www.bimant.com/blog/rgbd-to-point-cloud/

相关推荐

SpringBoot如何实现优雅的参数校验
SpringBoot如何实现优雅的参数校验

平常业务中肯定少不了校验,如果我们把大量的校验代码夹杂到业务中,肯定是不优雅的,对于一些简单的校验,我们可以使用java为我们提供的api进行处理,同时对于一些...

2025-05-11 19:46 ztj100

Java中的空指针怎么处理?

#暑期创作大赛#Java程序员工作中遇到最多的错误就是空指针异常,无论你多么细心,一不留神就从代码的某个地方冒出NullPointerException,令人头疼。...

一坨一坨 if/else 参数校验,被 SpringBoot 参数校验组件整干净了

来源:https://mp.weixin.qq.com/s/ZVOiT-_C3f-g7aj3760Q-g...

用了这两款插件,同事再也不说我代码写的烂了

同事:你的代码写的不行啊,不够规范啊。我:我写的代码怎么可能不规范,不要胡说。于是同事打开我的IDEA,安装了一个插件,然后执行了一下,规范不规范,看报告吧。这可怎么是好,这玩意竟然给我挑出来这么...

SpringBoot中6种拦截器使用场景

SpringBoot中6种拦截器使用场景,下面是思维导图详细总结一、拦截器基础...

用注解进行参数校验,spring validation介绍、使用、实现原理分析

springvalidation是什么在平时的需求开发中,经常会有参数校验的需求,比如一个接收用户注册请求的接口,要校验用户传入的用户名不能为空、用户名长度不超过20个字符、传入的手机号是合法的手机...

快速上手:SpringBoot自定义请求参数校验

作者:UncleChen来源:http://unclechen.github.io/最近在工作中遇到写一些API,这些API的请求参数非常多,嵌套也非常复杂,如果参数的校验代码全部都手动去实现,写起来...

分布式微服务架构组件

1、服务发现-Nacos服务发现、配置管理、服务治理及管理,同类产品还有ZooKeeper、Eureka、Consulhttps://nacos.io/zh-cn/docs/what-is-nacos...

优雅的参数校验,告别冗余if-else

一、参数校验简介...

Spring Boot断言深度指南:用断言机制为代码构筑健壮防线

在SpringBoot开发中,断言(Assert)如同代码的"体检医生",能在上线前精准捕捉业务逻辑漏洞。本文将结合企业级实践,解析如何通过断言机制实现代码自检、异常预警与性能优化三...

如何在项目中优雅的校验参数

本文看点前言验证数据是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每一层实现相同的验证逻辑,这既费时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证...

SpingBoot项目使用@Validated和@Valid参数校验

一、什么是参数校验?我们在后端开发中,经常遇到的一个问题就是入参校验。简单来说就是对一个方法入参的参数进行校验,看是否符合我们的要求。比如入参要求是一个金额,你前端没做限制,用户随便过来一个负数,或者...

28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)

在现代软件开发中,数据验证是确保应用程序健壮性和可靠性的关键环节。JavaBeanValidation(JSR380)作为一个功能强大的规范,为我们提供了一套全面的注解工具集,这些注解能够帮...

Springboot @NotBlank参数校验失效汇总

有时候明明一个微服务里的@Validated和@NotBlank用的好好的,但就是另一个里不能用,这时候问题是最不好排查的,下面列举了各种失效情况的汇总,供各位参考:1、版本问题springbo...

这可能是最全面的Spring面试八股文了

Spring是什么?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。...

取消回复欢迎 发表评论: