奥比中光相机的深度图像数据(TUM数据集)

原创 云深之无迹 2021-11-30 23:49


这篇文章写出来的东西,细节太多了。。。


https://github.com/ParikaGoel/KinectFusion


这个库是从Kinect相机中实时的重建环境


https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/ismar2011.pdf


实现的论文。


德国慕尼黑工业大学分享的RGBD数据集。


下面是格式的样子:


1. rgb.txt 和 depth.txt 记录了各文件的采集时间和对应的文件名。

2. rgb/ 和 depth/目录存放着采集到的 png 格式图像文件。彩色图像为八位三通道,深

度图为 16 位单通道图像。文件名即采集时间。

3. groundtruth.txt 为外部运动捕捉系统采集到的相机位姿,格式为

(time, t x , t y , t z , q x , q y , q z , q w ),


https://vision.in.tum.de/data/datasets/rgbd-dataset/download


这个链接是全部的数据集下载位置。



下载一个最小的看看



在下载了



这就是内容



解压以后就是这样的



地面轨迹



深度图



RGB的图




ROSbang的数据,我觉得Intel的工具可以一战



下载下来


ROS 包格式,这是一种用于将 ROS 消息存储在文件中的日志记录格式。使用这种格式的文件称为包,文件扩展名为.bag。包被rosbag和rqt_bag包中的工具记录、回放和一般操作。




解压后的文件


  • 彩色图像以 PNG 格式存储为 640x480 8 位 RGB 图像。

  • 深度图以 PNG 格式存储为 640x480 16 位单色图像。

  • 颜色和深度图像已经使用 PrimeSense 的 OpenNI 驱动程序预先注册,即颜色和深度图像中的像素已经 1:1 对应。

  • 深度图像按5000的因子进行缩放,即深度图像中5000的像素值对应距离相机1米,10000到2米距离等。像素值为0表示缺失值/没有数据。


已经被处理过了


将真实轨迹作为文本文件提供,其中包含相机在固定坐标系中的平移和方向


  • 文本文件中的每一行都包含一个姿势。

  • 每行的格式为' timestamp tx ty tz qx qy qz qw '

  • 时间戳(浮点数)给出自 Unix 纪元以来的秒数。

  • tx ty tz (3 个浮点数) 给出彩色相机的光学中心相对于运动捕捉系统定义的世界原点的位置。

  • qx qy qz qw(4 个浮点数)以单位四元数的形式给出彩色相机的光学中心相对于运动捕捉系统定义的世界原点的方向。

  • 该文件可能包含必须以“#”开头的注释。



从 2D 图像到 3D 点云的转换工作如下。请注意,每个相机的焦距 (fx/fy)、光学中心 (cx/cy)、畸变参数 (d0-d4) 和深度校正因子都不同。


下面的 Python 代码说明了如何根据像素坐标和深度值计算 3D 点:



中文的注释



英文


https://dev.intelrealsense.com/docs


Intelrealsense的文档


https://github.com/IntelRealSense/librealsense/releases


在这里下载播放工具



这么大



插我的R200没有反应,bang也读取不了



ROS包出错



但是会识别自带的摄像头,所以RealSense的相机也是UVC的驱动


https://www.mrpt.org/tutorials/programming/maths-and-geometry/2d_3d_geometry/


在惆怅之余,找到一个可以学习数学知识的链接:



然是不问因果的学


https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/


这个地址里面是一些关于处理RGBD的PY脚本。


Kinect 以不同步的方式提供颜色和深度图像。这意味着来自彩色图像的时间戳集与深度图像的时间戳不相交。因此,我们需要某种方式将彩色图像与深度图像相关联。


import argparseimport sysimport osimport numpy

def read_file_list(filename): """ Reads a trajectory from a text file.
File format: The file format is "stamp d1 d2 d3 ...", where stamp denotes the time stamp (to be matched) and "d1 d2 d3.." is arbitary data (e.g., a 3D position and 3D orientation) associated to this timestamp.
Input: filename -- File name
Output: dict -- dictionary of (stamp,data) tuples
""" file = open(filename) data = file.read() lines = data.replace(",", " ").replace("\t", " ").split("\n") list = [[v.strip() for v in line.split(" ") if v.strip() != ""] for line in lines if len(line) > 0 and line[0] != "#"] list = [(float(l[0]), l[1:]) for l in list if len(l) > 1] return dict(list)

def associate(first_list, second_list, offset, max_difference): """ Associate two dictionaries of (stamp,data). As the time stamps never match exactly, we aim to find the closest match for every input tuple.
Input: first_list -- first dictionary of (stamp,data) tuples second_list -- second dictionary of (stamp,data) tuples offset -- time offset between both dictionaries (e.g., to model the delay between the sensors) max_difference -- search radius for candidate generation
Output: matches -- list of matched tuples ((stamp1,data1),(stamp2,data2))
""" first_keys = first_list.keys() second_keys = second_list.keys() potential_matches = [(abs(a - (b + offset)), a, b) for a in first_keys for b in second_keys if abs(a - (b + offset)) < max_difference] potential_matches.sort() matches = [] for diff, a, b in potential_matches: if a in first_keys and b in second_keys: first_keys.remove(a) second_keys.remove(b) matches.append((a, b))
matches.sort() return matches

if __name__ == '__main__':
# parse command line parser = argparse.ArgumentParser(description=''' This script takes two data files with timestamps and associates them ''') parser.add_argument( 'first_file', help='first text file (format: timestamp data)') parser.add_argument( 'second_file', help='second text file (format: timestamp data)') parser.add_argument( '--first_only', help='only output associated lines from first file', action='store_true') parser.add_argument( '--offset', help='time offset added to the timestamps of the second file (default: 0.0)', default=0.0) parser.add_argument( '--max_difference', help='maximally allowed time difference for matching entries (default: 0.02)', default=0.02) args = parser.parse_args()
first_list = read_file_list(args.first_file) second_list = read_file_list(args.second_file)
matches = associate(first_list, second_list, float( args.offset), float(args.max_difference))
if args.first_only: for a, b in matches: print("%f %s" % (a, " ".join(first_list[a]))) else: for a, b in matches: print("%f %s %f %s" % (a, " ".join( first_list[a]), b-float(args.offset), " ".join(second_list[b])))


配准代码



深度图像已经与彩色图像配准,因此深度图像中的像素已经与彩色图像中的像素一一对应。因此,生成彩色点云很简单。



脚本使用方法



就一个函数


以上都可以从:


https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/


获得


https://vision.in.tum.de/data/datasets/rgbd-dataset/tools#evaluation


这些是文档:


怎么说呢,就是RGB和深度的图像采集回来以后,要进行一步融合操作,就好像是组装,在一张图像里面写入更多的信息。


接着按照规矩是对融合后的成果进行评价,但是这里就不加这步了。接着就可以做高层的点云展示啥的。


反正我也是给搞研究,这里就插点如何生成点云的算法操作,注意是一个rgb和图和一个深度图,生成一个点云图。


格式上面是:png+png=PLY format


最后这个格式,我最后补格式要求



做实验前,先准备一下


由于RGB和Depth是一一对应的关系,所以分辨率是一样的。深度图像 = 普通RGB三通道彩色图像 + Depth Map。


包含与视点场景对象表面距离有关信息的图像通道,通道本身类似于灰度图像,每个像素值是传感器测出距离物体的实际距离

分类

  • 与相机距离成比例:较近的表面较暗; 其他表面较轻

  • 与标称平面的距离相关:靠近焦平面的表面较暗; 远离焦平面的表面更轻



其实这个图是来自于一本书中


用深度相机获取到了深度图depth map,相当于黑白图像有两个通道,灰度值和深度值,彩色图像有四个通道RGBD。


图像深度 是指存储每个像素所用的位数,也用于量度图像的色彩分辨率。


图像深度 确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级。比如一幅单色图像,若每个像素有8位,则最大灰度数目为2的8次方,即256。一幅彩色图像RGB三通道的像素位数分别为4,4,2,则最大颜色数目为2的4+4+2次方,即1024,就是说像素的深度为10位,每个像素可以是1024种颜色中的一种。


  例如:

  一幅画的尺寸是1024*768,深度为16,则它的数据量为1.5M。


  计算如下:

  1024×768×16bit =   (1024×768×16)/8 Byte =   [(1024×768×16)/8]/1024 KB =   1536 KB =   {[(1024×768×16)/8]/1024}/1024 MB   = 1.5 MB


一个函数就完事了


“”“”“”是Python的说明文档,说了输入和输出


下面是使用了Image的打开方法



PIL库的方法



这里可以看作是处理前的准备,一定要保证分辨率的一致,我写个脚本验证一下。



这里先改名字



写脚本验证一下



都一样的



接着使用一个列表来放我们的点云数据


focalLength = 525.0centerX = 319.5centerY = 239.5scalingFactor = 5000.0



4参数


  • 深度图像按5000的因子进行缩放,即深度图像中5000的像素值对应距离相机1米,10000到2米距离等。

  • 像素值为0表示缺失值/没有数据。

  • 16bit的png是5000



这句是我们的精华


某点像素坐标(u , v)及其对应深度值depth,根据相机参数以及以下公式,可以求得该点的相机坐标(x , y , z)为



def depth2mi(depthValue):
return depthValue * 0.001

def depth2xyz(u, v, depthValue): fx = 361.1027 fy = 361.8266 cx = 258.4545 cy = 212.1282
depth = depth2mi(depthValue)
z = float(depth) x = float((u - cx) * z) / fx y = float((v - cy) * z) / fy
result = [x, y, z] return result



#深度图存入np数组arr = np.array(depth)#彩色图上某点像素坐标(u,v)在对齐深度图的深度值depthValue =float(arr3[v, u])coordinate = depth2xyz(u, v, depthValue)


上面是另一种实现。


然后我们讲算法?不~我们去看PIL


评论
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 78浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 64浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 82浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 58浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 55浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 105浏览
  • 电动汽车(EV)正在改变交通运输,为传统内燃机提供更清洁、更高效的替代方案。这种转变的核心是电力电子和能源管理方面的创新,而光耦合器在其中发挥着关键作用。这些不起眼的组件可实现可靠的通信、增强安全性并优化电动汽车系统的性能,使其成为正在进行的革命中不可或缺的一部分。光耦合器,也称为光隔离器,是一种使用光传输电信号的设备。通过隔离高压和低压电路,光耦合器可确保安全性、减少干扰并保持信号完整性。这些特性对于电动汽车至关重要,因为精确控制和安全性至关重要。 光耦合器在电动汽车中的作用1.电池
    腾恩科技-彭工 2025-01-10 16:14 59浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 78浏览
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 155浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 78浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 76浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦