我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深度图与RGB彩色图的对准(内附Python代码)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深度图与RGB彩色图的对准(内附Python代码)

在使用RealSense深度相机前,必须把深度相机和RGB相机对准了使用。。。不然会导致采集到的图像不对齐(如下图所示):

        

 

 左边是RGB图像,右边是深度图像。

 关于RealSense相机的校准,网上已经有了许多教程,这里就不再赘述。本文主要内容是如何处理已采集好的未对准的图像,以避免之前采集的一堆实验数据作废。搜索了很多教程,但是没找到现成的代码,唯一现成的代码是用C++写的。。。由于我太废物只会最简单的Python,因此决定自己写一版Python的代码。

代码的撰写思路

先简单讲述一下过程。以下是从别的教程复制粘贴的:

获取Kinect的深度图像;

获取RGB摄像头的图像;

为深度图像中的每一个像素附上对应的RGB颜色,比如你要给坐标为(x, y)的深度图像素附上颜色,具体步骤如下;

1)构造一个三维向量p_ir = (x, y, z),其中x,y是该点的像素坐标,z是该像素的深度值;

2)用Kinect内参矩阵H_ir的逆,乘以p_ir得到对应的空间点坐标P_ir,具体公式见上文第四部分(配准);

3)由于P_ir是该点在Kinect坐标系下的坐标,我们需要将其转换到RGB摄像头的坐标系下,具体的,就是乘以一个旋转矩阵R,再加上一个平移向量T,得到P_rgb;

4)用RGB摄像头的内参矩阵H_rgb乘以P_rgb,得到p_rgb,p_rgb也是一个三维向量,其x和y坐标即为该点在RGB图像中的像素坐标,取出该像素的颜色,作为深度图像中对应像素的颜色;

5)对深度图像中的每一个像素都做上述操作,得到配准后的深度图。

深度图与RGB图对齐原理

其原理就是:

  1. 深度图上的2D点转换到世界坐标的3D点(这里设为点A)
  2. 将点A的世界坐标的3D点投影到彩色图像上,获取点A在RGB图像上的坐标(x,y)
  3. 提取A点的RGB三通道的值,将其赋予到原深度图上点A的坐标上。

最后的效果是深度图像不变,RGB图像对齐到深度图像

注意:这里只能让RGB图像去对齐到深度图像而不能反过来,因为在第1步将图像上的点转化为世界坐标的3D点这里,只有深度图像内含的深度信息才能实现。RGB图像不含深度信息因此无法做到RGB图像不变,深度图像去对齐到RGB。

代码实现

下面就是Python代码的实现。

import numpy as npimport cv2# 获取RGB与深度图像信息。因为采集数据时是直接将RGB和深度信息一起存储到npy文件里,因此这里将RGB三通道和D深度通道的信息分开存储arr = np.load('Data.npy')b, g, r, d = cv2.split(arr)depth_img = d  # 深度信息rgb_img = cv2.merge([b, g, r])  # RGB信息# 深度相机的外参矩阵(包括旋转矩阵与传递矩阵), 这里是通过RealSense2的函数 get_extrinsics_to(profile) 获得后直接赋值的,具体可网上搜索教程R = np.array([(0.999993, 0.00372933, -0.000414306), (-0.00372927, 0.999993, 0.000135122), (0.000414807, -0.000133576, 1)])T = np.array([-0.0148581, -8.0544e-05, 2.60393e-05])# R1 = H_rgb@R@np.linalg.inv(H_depth)result = np.zeros([480, 640, 3])for row in range(480):    for col in range(640):        V_depth = depth_img[row][col]        p_depth = np.array([col, row, 1])        p_rgb = V_depth/1000*R@p_depth + T/1000        X = p_rgb[0]//p_rgb[2]        Y = p_rgb[1]//p_rgb[2]        if (0 <= X < 640) and (0 <= Y < 480):            result[row][col] = rgb_img[int(Y)][int(X)]        else:            result[row][col] = np.array([0, 0, 0])# cv2.imwrite('OMG/RGB.jpg', rgb_img)cv2.imwrite('OMG/RGB2.jpg', result)

这里的Python代码是照着这篇教程里的C++代码修改的:

kinect 2.0 SDK学习笔记(四)--深度图与彩色图对齐_深度相机rgb图和深度图对齐原理_jiaojialulu的博客-CSDN博客

最后得到的效果并不是很理想。但是由于时间有限,懒得进行进一步优化。猜测原因如果不是代码问题的话,就是之前深度相机没和RGB相机对准,两个相机范围相差过大导致的。欢迎大神找出原因并指导一下我(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )

 

参考文章:​​​​​​​Kinect深度图与RGB摄像头的标定与配准_aipiano的博客-CSDN博客

来源地址:https://blog.csdn.net/weixin_47331580/article/details/131806456

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深度图与RGB彩色图的对准(内附Python代码)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录