intel深度相机D455的使用

一、D455介绍

Intel RealSense D455 是RealSense D400系列的一部分,这个系列的设备以其高精度和可靠性而闻名。D455相比于之前的型号(如D415和D435),提供了更远的感知范围和更高的精度。

在这里插入图片描述

二、使用代码

我们先定义一下相关的函数,主要是要将我们拍摄的图片和深度信息保存地址的创建好,以及获取我们的深度相机的一些参数。

# utils.py
import os
import datetime
import pyrealsense2 as rsdef get_depth_camera_info(profile):"""获取深度相机的内参信息和深度值比例因子参数:pipeline: pipeline对象,已经初始化的深度相机返回值:depth_scale: 深度值的比例因子intrinsics: 深度图像的内参信息"""depth_sensor = profile.get_device().first_depth_sensor()depth_stream = profile.get_stream(rs.stream.depth)depth_intrinsics = depth_stream.as_video_stream_profile().get_intrinsics()depth_scale = depth_sensor.get_depth_scale()print("Depth Scale is: ", depth_scale)print("Depth intrinsics:")print(f"Width: {depth_intrinsics.width}")print(f"Height: {depth_intrinsics.height}")print(f"PPX (principal point x): {depth_intrinsics.ppx}")print(f"PPY (principal point y): {depth_intrinsics.ppy}")print(f"FX (focal length x): {depth_intrinsics.fx}")print(f"FY (focal length y): {depth_intrinsics.fy}")print(f"Distortion model: {depth_intrinsics.model}")print(f"Distortion coefficients: {depth_intrinsics.coeffs}")def create_camera_save_path(save_path=None):"""创建保存并返回 D455 图像和深度信息的路径Args:save_path: 自定义路径, default=None, 默认运行文件的当前目录下Returns:color图存储路径, depth信息存储路径"""if save_path is None:save_path = os.getcwd()time_path = f"{datetime.datetime.now():%Y_%m_%d_%H_%M_%S}".replace(":", "_")color_path = os.path.join(save_path, time_path, 'rgb')depth_path = os.path.join(save_path, time_path, 'depth')os.makedirs(color_path, exist_ok=True)os.makedirs(depth_path, exist_ok=True)return color_path, depth_path

这就是打印出来的信息

Depth Scale is: 0.0010000000474974513
Depth intrinsics:
Width: 640
Height: 480
PPX (principal point x): 321.67352294921875
PPY (principal point y): 237.27777099609375
FX (focal length x): 387.3067321777344
FY (focal length y): 387.3067321777344
Distortion model: distortion.brown_conrady
Distortion coefficients: [0.0, 0.0, 0.0, 0.0, 0.0]

下面是我们运行的主代码

# main.py
import pyrealsense2 as rs
import os
import cv2
import numpy as np
from Depth_camera.utils import get_depth_camera_info, create_camera_save_pathsaved_count = 0
extend_num = 3
width = 640
height = 480
fps = 30color_path, depth_path = create_camera_save_path()
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps)
config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps)profile = pipeline.start(config)
get_depth_camera_info(profile)try:while True:frames = pipeline.wait_for_frames()depth_frame = frames.get_depth_frame()color_frame = frames.get_color_frame()depth_image = np.asanyarray(depth_frame.get_data())color_image = np.asanyarray(color_frame.get_data())# 获取深度信息,以米为单位depth_scale = profile.get_device().first_depth_sensor().get_depth_scale()depth_image_in_meters = depth_image * depth_scale# 将无效的深度值设置为NaNdepth_image_in_meters[depth_image == 0] = np.nandepth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)images = np.hstack((color_image, depth_colormap))cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)cv2.imshow('RealSense', images)key = cv2.waitKey(1)if key & 0xFF == ord('s'):saved_count += 1print(f"{saved_count} 已保存图像至 {color_path}{depth_path}")cv2.imwrite(os.path.join(color_path, "{}.png".format(saved_count)), color_image)# 深度信息保存为 .npy 格式,单位为米np.save(os.path.join(depth_path, "{}.npy".format(saved_count)), depth_image_in_meters)elif key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()breakfinally:pipeline.stop()

正常显示

在这里插入图片描述

这段代码通过按下‘s’键对图片和深度信息进行保存,通过按下ESC键和‘q’键退出。

需要注意的是这里获取的深度信息,是以米为单位的。
在保存深度信息时候,如果保存的是颜色映射后的,它的通道数是3,这里保存的是单通道的。

在这里插入图片描述

现在我们来查看一下我们的深度图情况吧

import cv2
import numpy as npif __name__ == "__main__":color_image = cv2.imread(r"D:\PythonProject\Githubproject\Depth_camera\2024_05_31_21_29_23\rgb\1.png")depth_image = np.load(r"D:\PythonProject\Githubproject\Depth_camera\2024_05_31_21_29_23\depth\1.npy")print(depth_image.shape)cv2.imshow("color", color_image)x = 1y = 1truth_depth = depth_image[x, y]print(truth_depth)  # 出现了nan说明没有检测到深度信息cv2.imshow("color", depth_image)cv2.waitKey(0)

在上面显示的时候我们就发现物体边缘部分有偏深的部分,那部分就是相机没有检测到深度信息,在读取了npy文件后的效果是下面这样的
在这里插入图片描述
无效的深度区域是一个常见的问题,尤其是在使用深度相机时。

三、参考文章

https://blog.csdn.net/weixin_45303602/article/details/133683403
https://blog.csdn.net/weixin_50508111/article/details/126646903

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

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

相关文章

鸿蒙OS初识

学习官网:https://www.harmonyos.com/cn/develop 准备 注册,安装软件(node:12, DevEco Studio): https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415#ZH-CN_TOP…

MFC3d立体按钮制作

1、本程序基于前期我的博客文章MFC用CButtonST类实现图片透明按钮(免费源码下载) 2、添加CeXDib.cpp CeXDib.h ShadeButtonST.cpp ShadeButtonST.h到项目文件夹下,和FileView中如图。 3、在ButtonShadeDlg.h中添加代码 #include "ShadeButtonST.h" #in…

4分之1外螺纹怎么编程:挑战与策略解析

4分之1外螺纹怎么编程:挑战与策略解析 在机械制造领域,螺纹编程是一项至关重要的技术任务。当面对如4分之1外螺纹这样的具体需求时,编程人员需要综合运用专业知识与编程技巧,以确保螺纹的精确度和生产效率。本文将围绕四个方面、…

springboot595基于Java的大学生迎新系统-手把手调试搭建

springboot595基于Java的大学生迎新系统-手把手调试搭建 springboot595基于Java的大学生迎新系统-手把手调试搭建

Qml开发的两种方法

一.Qml开发的两种方法 1.Qt Creator 开发,手动编写qml代码 这种方法开发很方便,适合对qml语言非常熟悉的开发人员。 2.用Qt Design Studio 设计qml界面 这种方法更适合对qml不太熟悉的人,可以实现qml控件的拖拉拽,类似与widget界面开发&…

C#语言进阶(二)—事件 第二篇(.net标准事件模型)

总目录 C# 语法总目录 系列链接 C#语言进阶(二) 事件 第一篇(发布订阅模式) C#语言进阶(二) 事件 第二篇(.net标准事件模型) C#语言进阶(二) 事件 第二篇(事件访问器) 事件 第二篇目录 事件 第二篇2. .net标准事件模型 事件 第二篇 2. .net标准事件模型 标准事件模型…

【原型模式】详解

一.概念 原型模式是一种创建型设计模式,它的主要思想是通过复制现有对象来创建新对象,而不是通过实例化一个类来创建。在原型模式中,我们称被复制的对象为原型(Prototype),新创建的对象为克隆体&#xff0…

用户画像知识点补充——多数据源

引入 针对用户画像项目来说(产品)必须要支持从多种数据源加载业务数据,构建用户标签。 在之前的标签模型开发中,主要是为了简化开发复杂度,业务数据统一存储到HBase表中。 数据源包含如下几个方面: 存储H…

【应用层】 DNS 域名协议解析

文章目录 DNS(Domain Name System)出现及演化 ⏳DNS 概括🔍DNS定义DNS 作用 DNS工作原理⚙️域名解析DNS解析的详细工作流程 DNS域名解析方式🔄静态DNS域名解析动态DNS域名解析 DNS域名解析过程的深入分析 🧐递归查询迭代查询 公共DNS服务器的…

Tailwindcss Flex 布局相关的样式类及其实战案例

007 Flex布局相关的样式 flex-basics 相关的样式类 ClassPropertiesbasis-0flex-basis: 0px;basis-1flex-basis: 0.25rem; /* 4px */basis-2flex-basis: 0.5rem; /* 8px */basis-3flex-basis: 0.75rem; /* 12px */basis-4flex-basis: 1rem; /* 16px */basis-5flex-basis: 1.2…

docker-comopse容器因依懒关系无启动解决方法

1、确认出影响项目开机自启的容器 通docker logs -f 确认容器是否正常docker restart 重启容器,如果项目正常,把异常容器加入rc.local中,待开机一定时间后,重启此容器。 2、在rc.local中添加延时重启对应容器 #vim /etc/rc.loc…

STC8增强型单片机进阶开发--LED呼吸灯(PWM)

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 PWM基础概念 STC8H芯片 PWMA应用 PWM配置详解 周期 占空比 模式 使能PWM 引脚配置 EAXSFR扩展寄存器 总结 前言 学习PWM(脉宽调制)是探索数字信号转模拟信号的重要一步,尤…

ad18学习笔记21:焊盘设置Paste Mask Expansion(锡膏层延伸)

在pcb上放置焊盘的时候,可以对焊盘进行设置,可以用默认的规则,可以用自定义的规则,网上很少看到自定义的规则怎么用。 参考了官方的说明文档,我只是稍微补充了一下 paste mask与solder mask有哪些区别_paste mask与s…

文件上传之使用一个属性接收多个文件

在开发过程中&#xff0c;可能遇到这样的业务&#xff1a;文件上传时个数不定&#xff0c;这样我们不能枚举出所有的文件name&#xff0c;这种情况下我们可以使用一个name将所有的文件接收下来&#xff1b; html代码 <!DOCTYPE html> <html lang"en"> …

终于更新了!时隔一年niushop多商户b2b2c的新补丁v5.0.2终于发布了,一起看看有啥新变化

注意这是最新版的V5.02_多商户V5.0.2版本更新说明 瞧瞧更新了什么内容&#xff0c; 优化功能 优化手机号、身份证等常用验证规则&#xff0c;全局化处理优化商品列表接口查询速度 修复功能修复系统内部分图片上传功能调用接口跨端口问题修复总后台和商家后台订单管理搜索标签在…

Ubuntu上安装Conda步骤

按照官方文档下载并安装miniconda脚本 https://docs.anaconda.com/free/miniconda/ mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda…

一文彻底讲透 PyTorch

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

JQC-3FF-S-Z 继电器模块使用(arduino)

前言 继电器模块可以控制电流的接通和非接通状态&#xff0c;和开关一样。实际上是用小电流去控制大电流运作的一种“自动开关” 本文只是简单使用继电器模块做一个 led 点亮和熄灭的案例&#xff0c;结合案例可以和 nodemcu 等板子结合做出远程控制开关。 材料准备 杜邦线…

无限可能LangChain——构建一个简单的LLM应用程序

在本快速入门中&#xff0c;我们将向您展示如何构建一个简单的LLM应用程序。该应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个LLM调用加上一些提示。尽管如此&#xff0c;这仍然是开始使用LangChain的好方法——只需一些提示和一个LLM调用…

小波相干性显著性检验(MATLAB R2018A)

交叉小波常被用于检测不同信号之间的相关性&#xff0c;其在时频域建立了不同信号之间的联系。对于两个时域信号&#xff0c;其交叉小波变换和交叉小波尺度谱如下&#xff1a; 以轴承振动信号为例&#xff0c;利用正常轴承与故障轴承的振动信号、故障轴承和故障轴承的振动信号分…