深度图可视化显示(kitti)

news2024/9/21 1:21:47

文章目录

  • 前言
  • 一、读取深度值与图像
    • 1、深度值读取
    • 2、图像读取
  • 二、深度图可视化
    • 1、深度图可视化代码
    • 2、深度图可视化结果展示
  • 三、深度图在图像上可视化
    • 1、可视化代码
    • 2、可视化坐标显示
  • 四、完整代码

前言

kitti数据是一个通用数据,有关kitti的深度图像内容我已有博客介绍。这里,我将给出一个工具,用于显示深度值对应像素坐标再图像上,也给出深度值可视化显示内容。

一、读取深度值与图像

很简单,直接使用cv与PIL库可实现数据读取,其调用代码如下:

    path = './data/2011_09_26_drive_0001_sync'
    index = '0000000005'
    image_2_path = os.path.join(path, '2011_09_26_drive_0001_sync/2011_09_26/2011_09_26_drive_0001_sync/image_02/data', index + '.png') # 获得图像
    depth_path = os.path.join(path,'2011_09_26_drive_0001_sync/proj_depth/groundtruth/image_02',index+'.png')

    groundtruth = depth_read(depth_path)
    img = get_image(image_2_path)  # 读取图像

1、深度值读取

使用官网提供方法,该方法得到是真实相机坐标系下z轴距离,我会在后面图显示,其代码如下:

def depth_read(filename):
    # loads depth map D from png file
    # and returns it as a numpy array,
    # for details see readme.txt

    depth_png = np.array(Image.open(filename), dtype=int)
    # make sure we have a proper 16bit depth map here.. not 8bit!
    assert(np.max(depth_png) > 255)

    depth = depth_png.astype(np.float) / 256.
    # depth[depth_png == 0] = -1.
    return depth

2、图像读取

图像是对应的深度图的图像,以相机02为准,其代码如下:

def get_image(img_path):
    img = cv2.imread(img_path)
    return img

二、深度图可视化

显然,我们只需使用深度图信息即可实现。

1、深度图可视化代码

直接使用plt可实现,其代码如下:

def show_depth(groundtruth):
    # import numpy as np
    # import matplotlib.pyplot as plt

    # 假设我们有深度数据存储在一个名为depth_data的NumPy数组中。
    # 这个数组应该具有与你的图像相同的形状。

    # 转换深度数据到0-1范围内的浮点数
    normalized_depth = groundtruth.astype(np.float32) / groundtruth.max()

    # 创建一个颜色映射,从蓝色(最小值)到黄色(最大值)

    cmap = plt.get_cmap('viridis')

    # 使用颜色映射创建一个新的图像
    color_image = cmap(normalized_depth)

    # 删除alpha通道(如果有的话)
    if color_image.shape[-1] == 4:
        color_image = color_image[..., :3]

    # 显示新的彩色图像
    plt.imshow(color_image)
    plt.colorbar()
    plt.show()


2、深度图可视化结果展示

在这里插入图片描述

三、深度图在图像上可视化

1、可视化代码

明显,我目的是要将对应深度图值显示在对应图像上,其代码如下:

def show_depth2img(img,groundtruth,interval_x=100, interval_y=20):
    """
    将深度图对应深度图值按照约定行与列像素打印到图像上方法
    :interval_x=100:x坐标按照多少像素取值,决定x方向间隔
    :interval_y=20:y坐标按照多少像素取值,决定y方向间隔
    :param img: 原始图像内容
    :param groundtruth: 深度图值
    :return: 返回一个显示深度图值在图像上
    """
    h, w = img.shape[:2]
    # interval_x, interval_y = 100, 20  # w与h相隔多少像素显示内容
    numpy_y, numpy_x = int(h / interval_y), int(w / interval_x)

    for i in range(numpy_x):
        for j in range(numpy_y):
            x = int(interval_x * i)
            y = int(interval_y * j)
            value = groundtruth[y, x]
            img = draw_circle_coord(img, coord=(x, y), value=value)

2、可视化坐标显示

在这里插入图片描述
你会发现有很多值是0,这是正常的。你也发现数值确实也是kitti官网说的,是真实距离坐标,确实是这样的,如图显示。

四、完整代码

最后,我给出一个完整代码,可以直接执行,其代码如下:

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
def get_image(img_path):
    img = cv2.imread(img_path)
    return img
def show_img(img):

    plt.imshow(img)
    plt.show()

from PIL import Image

def depth_read(filename):
    # loads depth map D from png file
    # and returns it as a numpy array,
    # for details see readme.txt

    depth_png = np.array(Image.open(filename), dtype=int)
    # make sure we have a proper 16bit depth map here.. not 8bit!
    assert(np.max(depth_png) > 255)

    depth = depth_png.astype(np.float) / 256.
    # depth[depth_png == 0] = -1.
    return depth

def show_depth(groundtruth):
    # import numpy as np
    # import matplotlib.pyplot as plt

    # 假设我们有深度数据存储在一个名为depth_data的NumPy数组中。
    # 这个数组应该具有与你的图像相同的形状。

    # 转换深度数据到0-1范围内的浮点数
    normalized_depth = groundtruth.astype(np.float32) / groundtruth.max()

    # 创建一个颜色映射,从蓝色(最小值)到黄色(最大值)

    cmap = plt.get_cmap('viridis')

    # 使用颜色映射创建一个新的图像
    color_image = cmap(normalized_depth)

    # 删除alpha通道(如果有的话)
    if color_image.shape[-1] == 4:
        color_image = color_image[..., :3]

    # 显示新的彩色图像
    plt.imshow(color_image)
    plt.colorbar()
    plt.show()


def draw_circle_coord(image,coord=None,value=None):
    if coord is not None and value is not None:
        coord = tuple(coord)
        image = cv2.circle(image, coord, 5, (255, 0, 0), -1)
        value = round(value,2)
        image = cv2.putText(image, str(value)+'m', coord, cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255), 1, cv2.LINE_AA)
    return image

def show_depth2img(img,groundtruth,interval_x=100, interval_y=20):
    """
    将深度图对应深度图值按照约定行与列像素打印到图像上方法
    :interval_x=100:x坐标按照多少像素取值,决定x方向间隔
    :interval_y=20:y坐标按照多少像素取值,决定y方向间隔
    :param img: 原始图像内容
    :param groundtruth: 深度图值
    :return: 返回一个显示深度图值在图像上
    """
    h, w = img.shape[:2]
    # interval_x, interval_y = 100, 20  # w与h相隔多少像素显示内容
    numpy_y, numpy_x = int(h / interval_y), int(w / interval_x)

    for i in range(numpy_x):
        for j in range(numpy_y):
            x = int(interval_x * i)
            y = int(interval_y * j)
            value = groundtruth[y, x]
            img = draw_circle_coord(img, coord=(x, y), value=value)

if __name__ == '__main__':
    path = './data/2011_09_26_drive_0001_sync'
    index = '0000000005'
    image_2_path = os.path.join(path, '2011_09_26_drive_0001_sync/2011_09_26/2011_09_26_drive_0001_sync/image_02/data', index + '.png') # 获得图像
    depth_path = os.path.join(path,'2011_09_26_drive_0001_sync/proj_depth/groundtruth/image_02',index+'.png')

    groundtruth = depth_read(depth_path)
    img = get_image(image_2_path)  # 读取图像

    show_depth(groundtruth)  # 显示深度图

    img = show_depth2img(img, groundtruth, interval_x=100, interval_y=20)

    cv2.imwrite('out_dir/draw_coord.png',img)

    show_img(img)


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

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

相关文章

扣子智能体实战:一键生成公众号图文,AI时代文盲也能写公众号,赚钱秘籍

文章目录 一,需求简述二,智能体制作1,智能体人设和技能2,流程开发2.1 设置开始节点2.2 增加一个生成标题的大模型节点2.3 增加一个代码节点 2.4 增加一个插件节点用以生成文章配图2.4 增加一个大模型节点-根据标题和思路生成文章大…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序(rank函数轻松搞定) 以上函数非常简单,记住两点: 1.rank排名同分作为同一名次,后面的名次需要占位,如,以上两个70分,同为第8名,那么第9名将被…

Shader 中的光源

1、Shader 开发中常用的光源属性 Unity当中一共支持四种光源类型: 平行光(Directional)点光源(Point)聚光灯(Spot)面光源(Area)— 面光源仅在烘焙时有用 不管光源类型到…

可视化工具箱-Visualization Toolkit(VTK)

一、Visualization Toolkit(VTK)简概 可视化工具箱(VTK),是一个用于3D计算机图形、图像处理和科学可视化的开源软件系统,其包含C类库和Tcl/Tk、Java与python的解释型接口层。VTK支持各种可视化算法&#xf…

软设9.20

1 已知一个文件中出现的各字符及其对应的频率如下表所示。若采用定长编码,则该文件中字符的码长应为()。若采用Hufman编码,则字符序列“face”的编码应为()。 1.() A.2 B.3 C.4 D.5 2.() A.110001001101…

小程序构建npm失败

小程序构建npm失败 项目工程结构说明解决方法引入依赖导致的其他问题 今天在初始化后的小程序中引入TDesign组件库,构建npm时报错。 项目工程结构说明 初始化后的项目中,包含miniprogram文件夹和一些项目配置文件,在project.config.json文件中…

VS运行程序时报错--无法定位程序输入点

发现问题: VS 在运行程序时,报错: 找到原因: 因为我在替换动态库的时候,只替换了lib库,没有替换运行目录下的dll库,运行时候的dll与程序中的lib库不对应。 替换库后就能解决这个问题。

秋意渐浓,温暖筹备——铁路职工御寒劳保鞋,寒冬无阻!

随着秋意渐浓,气温逐渐走低,冬日的寒风已在不远处蓄势待发。对于坚守在铁路一线的工友们来说,这不仅是季节的变换,更是工作装备升级换代的信号。意味着需要更加注重防寒保暖,以确保在寒冷的天气中能够安全、高效地工作…

前端大数据渲染:虚拟列表、触底加载与分堆渲染方案

前言 针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿 下面总结常见…

工程师 - PFM介绍

在电子电路设计中,PFM(Pulse Frequency Modulation,脉冲频率调制)是一种调制技术,其主要特点是在负载变化时调整脉冲的频率,而保持脉冲的宽度(时间长度)相对恒定。与PWM(…

lambda 自调用递归

从前序与中序遍历序列构造二叉树 官方解析实在是记不住&#xff0c;翻别人的题解发现了一个有意思的写法 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {auto dfs [](auto&& dfs, auto&&…

深度学习-图像处理篇1.1-1.2神经网络

1.1卷积神经网络基础 卷积层 对彩色RGB图像进行卷积 1.卷积核的通道数与输入特征层的通道数相同 2.卷积输出的特征矩阵通道数与卷积核个数相同 池化层 池化中一般池化核大小和步长大小一样 思考 加上偏移量bias该如何计算? 卷积计算时加上偏移量即可 加上激活函数该如何计…

Nomad Web服务终于成熟了!

大家好&#xff0c;才是真的好。 9月份HCL Notes/Domino相关产品发布的还真不少&#xff0c;前脚刚发布了HCL Notes Domino 14.5 EA1&#xff0c;后脚就迎来了Notes Domino 14.0FP2IF1&#xff0c;还有Nomad 1.0.13版本。 在我的记忆中&#xff0c;他们不喜欢数字13&#xff…

分布式消息中间件kafka

文章目录 什么是kafka?整体架构 kafka核心概念1. 生产者 (Producer)2. 消费者 (Consumer)3. 主题 (Topic)4. 分区 (Partition)5. 经纪人 (Broker)6. 复制 (Replication)7. 消费者组 (Consumer Group)8. 日志段 (Log Segment) 主要功能1. 高吞吐量2. 可靠的消息传递3. 发布/订阅…

打印菱形(图像打印)

//打印菱形 // ---* // *** // ***** // ******* // ***** // *** // * //一共需要line行&#xff0c;分成两边&#xff0c;上半部分需要line/21行 //下半部分需要line/2行 #include<stdio.h> #define L 11 //行 #define R 11 //列 int main() {int …

十三 系统架构设计(考点篇)试题

A 对&#xff0c;B对&#xff0c;C好像是分布式中间件吧&#xff0c;D对。选C 第一题&#xff0c;感觉肯定有交互支持&#xff0c;选B;第二B。实际答案&#xff1a;D和B。 在一个分布式系统中&#xff0c;中间件通常提供两种不同类型的支持&#xff1a; &#xff08;1&#xff…

【读书笔记-《30天自制操作系统》-23】Day24

本篇内容依然比较简单&#xff0c;主要是优化窗口功能以及开发定时器应用程序。首先是优化窗口的切换功能&#xff0c;实现通过键盘和鼠标切换窗口&#xff0c;然后是实现通过鼠标关闭窗口。接着实现不同窗口输入状态的切换&#xff0c;最后是实现定时器的API与应用程序。 1.…

mybatisplus乐观锁

使用方法&#xff1a; 1.添加version锁标记字段 2.实体类添加对应字段&#xff0c;并加上Version注解 3.添加配置类 Configuration public class MpComfig {Beanpublic MybatisPlusInterceptor mpInterceptor(){MybatisPlusInterceptor mpInterceptor new MybatisPlusIntercep…

VuePress搭建文档网站/个人博客(详细配置)主题配置-侧边栏配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

沟通更高效:微信群转移至企业微信操作攻略!

微信群转移到企业微信并不难&#xff0c;具体操作如下&#xff1a; 打开移动端企业微信主页&#xff0c;找到微信聊天栏中的【接收微信中的工作消息】&#xff1b; 点击【前往微信选择群聊】&#xff0c; 跳转到微信&#xff1b; 选择微信上的工作群聊&#xff0c;只能选择作…