当前位置: 首页 > news >正文

深度图可视化显示(kitti)

文章目录

  • 前言
  • 一、读取深度值与图像
    • 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.txtdepth_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 Imagedef depth_read(filename):# loads depth map D from png file# and returns it as a numpy array,# for details see readme.txtdepth_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 depthdef 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 imagedef 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)

相关文章:

深度图可视化显示(kitti)

文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据,有关kitti的深度图像内容我已有博…...

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容? 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例:HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…...

adb devices不显示连接设备怎么解决

adb devices不显示设备,首先用老办法检查。假如是显示adb这个命令不认识,那就是系统路径问题。假如能认识adb这个命令,那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题:我把网上的攻略都试了一遍,设备驱…...

经典sql题(一)求连续登录不少于三天用户

示例数据 假设我们的 test 表有以下数据: iddate12023-10-01 08:00:0012023-10-01 09:00:0012023-10-02 10:00:0012023-10-03 11:00:0022023-10-01 10:00:0022023-10-02 12:00:0022023-10-03 14:00:0022023-10-04 15:00:0032023-10-01 16:00:00 第一步&#xff1…...

2024java面试-软实力篇

为什么说简历很重要? 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下,写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢? 、 先从面试来说 假如你是网申,你的简历必然…...

「OC」present和push操作区别以及混合推出的实现

「OC」present和push操作区别以及混合推出的实现 文章目录 「OC」present和push操作区别以及混合推出的实现前言present用途while循环越级返回通知越级返回添加present动画 push模态视图和push视图混合跳转操作一:控制器Apresent控制器B,控制器B再将控制…...

【高分系列卫星简介】

高分系列卫星是中国国家高分辨率对地观测系统(简称“高分工程”)的重要组成部分,旨在提供全球范围内的高分辨率遥感数据,广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…...

八股文-多线程、并发

八股文-多线程、并发 最近学到了一种方法,可以用于简历项目经验编写以及面试题目的回答 STAR法则:在什么背景下,你需要解决什么问题,你做了啥,得到了什么结果 情境(Situation): 描…...

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸,我们沿b边(左边)的中点与右上顶点的边折叠,求左上顶点在折叠以后离下边的距离? 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为两个整数1≤a,b≤1000。…...

传知代码-多示例AI模型实现病理图像分类

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了,那么多示例学习模型对处理病理学图像具有…...

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用(SoftReference)弱引用(WeakReference)考一考 虚引用(PhantomReference)总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…...

LeetCode746:使用花费最小爬楼梯

题目链接&#xff1a;746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {int m cost.size();if(m 1) return min(cost[1], cost[0]);if(m 0) return cost[0]…...

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…...

【资料分析】刷题日记3

第一套 √ 考点&#xff1a;基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量&#xff0c;求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / &#xff08;4…...

基于SpringBoot+Vue的商场停车场管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…...

基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)

演示 智能物流柜&#xff08;基础版&#xff09; 智能物流柜&#xff08;升级版&#xff09; 前言 这是本人在大二在学校接的一个简单的实验室项目&#xff0c;之前发布了一个&#xff0c;由于那是在暑假&#xff0c;家里器材有限&#xff0c;代码敲完之后&#xff0c;用面包板…...

VSCode创建C++项目和编译多文件

前言 在刚安装好VSCode后&#xff0c;我简单尝试了仅main.cpp单文件编译代码&#xff0c;没有问题&#xff0c;但是当我尝试多文件编译时&#xff0c;就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”&#xff1b;在菜单中选择“打开文件夹”&#xff1b;在…...

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具&#xff0c;能帮助用户更轻松…...

C++——用带有默认参数的函数实现,求两个整数或三个整数中的最大数。

没注释的源代码 #include <iostream> using namespace std; int max(int a,int b,int c0); int main() { int a,b,c; cout<<"请输入三个整数&#xff1a;"; cin>>a>>b>>c; cout<<"三个整数的最大值是&am…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...