深度图可视化显示(kitti)

前言

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangjunjun-owen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值