Make3D数据集相关介绍

一、参考资料

Make3d数据集使用方法

二、相关介绍

1. 简介

Make3D 数据集的每帧图像的深度值均由激光雷达进行采集,相较于 Kinect 相机采集的深度信息,该测距仪可以得到室外图像更加精确的深度信息,而且测距范围更大,与普通的深度传感器相比还具有分辨率高、抗干扰能力强等特点。

注意说明:由于 Make 3D 图像中深度层次区分不明显,所以采用热力图表示其深度估计结果。

2. 训练集与测试集

Make3D 数据集是一个单目深度估计数据集,包含 534 对 RGB-D 图像对(包括 RGB 图像及其对应的深度图像)。其中,400 对图像对用于训练,134 对图像用于测试。 RGB 图像具有高分辨率,而深度图是低分辨率的。

注意:通常,Make3D 数据集只用来测试在KITTI数据集上训练好的权重的性能,也就是只作为测试集,因此只下载134张图片与对应的深度mat。

3. 下载链接

  1. Make3D数据集官方网站,由Cornell University提供:Make3D — Range Image Dataset

  2. Make3D数据集在超神经(HyperAI)平台上的介绍页面,提供了数据集的详细信息和下载选项:Make3D 单目深度估计数据集 - 超神经

三、常用操作

1. 提取.mat文件

import scipy.io 


# 加载.mat文件  
mat_data = scipy.io.loadmat('path_to_make3d_data.mat')  
  
# 假设Position3DGrid是存储在mat_data中的一个变量  
if 'Position3DGrid' in mat_data:  
    position_3d_grid = mat_data['Position3DGrid']  
      
    # position_3d_grid 是一个三维数组,每个元素是一个三维坐标点  
    # 访问第一个点: 
    first_point = position_3d_grid[0, 0, :]  # (H, W, Z)的结构  
    print(first_point)  # 输出第一个点的三维坐标  
else:  
    print("Position3DGrid not found in the .mat file.")  
  
# 注意:这里的索引和维度可能需要根据实际的Position3DGrid数据结构来调整

一个 .mat 文件对应一张深度图,解析 .mat 文件,得到数据维度为 (55, 305, 4)。

  1. 第一个维度(55):Height高度,图像的垂直方向像素数量。
  2. 第二个维度(305):Width宽度,图像的水平方向像素数量;
  3. 第三个维度(4)
    • X坐标:网格点在三维空间中的X位置。
    • Y坐标:网格点在三维空间中的Y位置。
    • Z坐标:网格点在三维空间中的Z位置(对应于深度或距离)。
    • 额外信息:最大有效深度,设置为80。

在这里插入图片描述

2. 深度图可视化

import h5py
import scipy.io
import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')


# 定义颜色映射
# cmap = plt.cm.jet
# cmap = plt.cm.hot
# cmap = plt.cm.plasma
cmap = plt.cm.viridis
# cmap = plt.cm.Greys


def show_depth():
    # 指定.mat文件路径
    path_mat_file = '/PATH/TO/Make3D/Gridlaserdata/depth_sph_corr-10.21op2-p-015t000.mat'
    path_rgb_image = '/PATH/TO/Make3D/Test134/img-10.21op2-p-015t000.jpg'

    # 使用scipy.io加载.mat文件
    mat_data = scipy.io.loadmat(path_mat_file)
    data = mat_data['Position3DGrid']

    # 可视化RGB图像
    image = Image.open(path_rgb_image)
    plt.figure(figsize=(8, 6))
    plt.subplot(2, 1, 1)
    plt.imshow(image)
    plt.title('Original Image')
    plt.axis('off')  # 不显示坐标轴

    # 可视化深度图像
    # depth_map[H, W, Depth]
    depth = data[:, :, 3]
    # 深度值归一化
    depth_normalized = (depth - np.min(depth)) / (np.max(depth) - np.min(depth))
    plt.subplot(2, 1, 2)
    plt.imshow(depth_normalized, cmap=cmap, interpolation='nearest')  # 选择深度图的第三维度进行可视化
    plt.title('Depth Map Visualization')
    plt.axis('off')  # 不显示坐标轴


if __name__ == '__main__':
    show_depth()

在这里插入图片描述

3. 保存深度图

import h5py
import scipy.io
import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')


# 定义颜色映射
# cmap = plt.cm.jet
# cmap = plt.cm.hot
# cmap = plt.cm.plasma
cmap = plt.cm.viridis
# cmap = plt.cm.Greys


def save_depth():
    # 指定.mat文件的根路径
    dir_mat_file = '/PATH/TO/Gridlaserdata/'

    # 保存深度图的路径
    depths_path = '/PATH/TO/make3d_depths/'

    if not os.path.exists(depths_path):
        os.makedirs(depths_path)

    for mat_item in os.listdir(dir_mat_file):
        print(mat_item)
        path_mat_file = os.path.join(dir_mat_file, mat_item)
        base_name = os.path.basename(mat_item)
        prefix_name = os.path.splitext(base_name)[0]

        # 使用scipy.io加载.mat文件
        mat_data = scipy.io.loadmat(path_mat_file)

        depth_map = mat_data['Position3DGrid']

        # depth_map[H, W, Depth]
        depth = depth_map[:, :, 3]
        depth_normalized = (depth - np.min(depth)) / (np.max(depth) - np.min(depth))
        depth_image = Image.fromarray(depth_normalized)
        depth_image_path = os.path.join(depths_path, f'{prefix_name}.png')
        plt.imsave(depth_image_path, depth_image, cmap=cmap)


if __name__ == '__main__':
    save_depth()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【stm32笔记】DSP库调用

参考:DSP库调用 , __CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT1U, ARM_MATH_CM4把需要的库复制出来单独用,方便移植

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数…

什么是X电容和Y电容?

先补充个知识: 一、什么是差模信号和共模信号 差模信号:大小相等,方向相反的交流信号;双端输入时,两个信号的相位相差180度 共模信号:大小相等。方向相同。双端输入时,两个信号相同。 二、安规…

小程序如何重启

用户在使用小程序的过程中,有时候会碰到一些问题。比如小程序数据不加载、卡顿、崩溃或者出现其他异常情况。这时候,最简单的办法就是重启小程序。但是很多客户不知道如何重启小程序,下面就具体介绍小程序重新启动的几种方法。 1. 强制关闭&…

CWDM、DWDM、MWDM、LWDM:快速了解光波复用技术

在现代光纤通信领域,波分复用(WDM)技术作为一项先进的创新脱颖而出。它通过将多个不同波长和速率的光信号汇聚到一根光纤中来有效地传输数据。本文将深入探讨几种关键的 WDM 技术(CWDM、DWDM、MWDM 和 LWDM)&#xff0…

流量分析。

流量分析 在Wireshak抓包可以看到正常的执行流程如下: ● Client向Server发起Load data local infile请求 ● Server返回需要读取的文件路径 ● Client读取文件内容并发送给Server ● PS:在本机上启动服务端与客户端,启动wireshark 抓包&…

根据相同的key 取出数组中最后一个值

数组中有很多对象 , 需根据当前页面的值current 和 数组中的key对比 拿到返回值 数据结构如下 之前写法 const clickedItem routeList.find(item > item.key current) // current是当前页 用reduce遍历数组返回最后一个值 const clickedItem routeList.reduce((lastIte…

41.乐理基础-拍号-小节、小节线、终止线

小节线:下图红框中的竖线就是小节线 小节、终止线:最后的终止线就是文字意思表示乐谱结束了,后面没有了 下图中 0.5表示0.5拍(八分音符)、1表示1拍(四分音符)、0.25表示0.25拍(十六分…

学习Rust的第29天: cat in Rust

今天即将是这个系列的最后一次内容,我们正在catRust 中从 GNU 核心实用程序进行重建。cat用于将文件内容打印到STDOUT.听起来很容易构建,所以让我们开始吧。 GitHub 存储库:GitHub - shafinmurani/gnu-core-utils-rust 伪代码 function read(…

Transformer详解:从放弃到入门(一)

Transformer由论文《Attention is All You Need》提出,是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,在自然语言处理领域获得了巨大的成功,在这个…

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件:互联网社交软件的独特优势 首先,社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中,人们需要面对面交流,这种方式在时间和空间上都受到限制。而社交软件打破了这些限制,无论我们身处何地…

如何复制本地docker镜像到其他主机

(1)打包镜像 比如我要复制的镜像是grafana的镜像 docker images 这里我把打包的镜像放在了根~目录下,如截图所示: docker save grafana/grafana:latest -o ~/grafana.jar (2)移动镜像 scp命令拷贝镜像到目标…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工,员工的数目应该根据公司的…

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件,文件名很多都是一大串字母和数字,不打开看看,根本不知道里面是什么内容。 我想能不能做个工具,把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

刷代码随想录有感(57):二叉搜索树中的众数

题干&#xff1a; 代码&#xff1a; class Solution { public:unordered_map<int,int>map;void traversal(TreeNode* root){if(root NULL)return;traversal(root->left);map[root->val];traversal(root->right);}bool static cmp(const pair<int,int>&a…

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护 查看ida 大致就是只能创建0x60大小的堆块&#xff0c;并且uaf只能利用一次 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./ezheap2.31)def alloc(content):p.sendlineafter(b4.exit,b1)p.send(content) def free(index):p.sendlineaft…

C++:运算符重载(=/==)

赋值运算符&#xff08;&#xff09;重载 在C中&#xff0c;赋值运算符可以被重载&#xff0c;允许用户定义类对象的赋值行为。通过重载赋值运算符&#xff0c;可以自定义对象的赋值操作&#xff0c;以便适应特定的需求和语义。当我们定义一个自定义的类时&#xff0c;比如一个…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;

说说你对盒子模型的理解?

一、是什么 当对一个文档进行布局&#xff08;layout&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff08;box&#xff09; 一个盒子由四…