intel深度相机D455的使用

一、D455介绍

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

在这里插入图片描述

二、使用代码

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

# utils.py
import os
import datetime
import pyrealsense2 as rs

def 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_path


saved_count = 0
extend_num = 3
width = 640
height = 480
fps = 30

color_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

        # 将无效的深度值设置为NaN
        depth_image_in_meters[depth_image == 0] = np.nan

        depth_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 += 1
            print(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()
            break

finally:
    pipeline.stop()

正常显示

在这里插入图片描述

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

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

在这里插入图片描述

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

import cv2
import numpy as np

if __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 = 1
    y = 1
    truth_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

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

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

相关文章

深入理解Java中的List集合:解析实例、优化技巧与最佳实践

一:List 集合的基础 1.1 什么是 List 集合? List 集合是 Java 集合框架中的一种有序、可重复的数据结构,它继承自Collection 接口,允许存储多个元素。 与数组不同,List 集合的大小是动态可变的,可以根据…

Elasticsearch:基于多个 kNN 字段对文档进行评分

作者:来自 Elastic Madhusudhan Konda 通过具有多个 kNN 字段的最接近的文档对文档进行评分 Elasticsearch 不仅仅是一个词法(文本)搜索引擎。 Elasticsearch 是多功能搜索引擎,除了传统的文本匹配之外,还支持 k 最近…

海外高清短视频:四川京之华锦信息技术公司

海外高清短视频:探索世界的新窗口 在数字化时代的浪潮下,海外高清短视频成为了人们探索世界、了解异国风情的新窗口。四川京之华锦信息技术公司这些短视频以其独特的视角、丰富的内容和高清的画质,吸引了无数观众的目光,让人们足…

DI-engine强化学习入门(一)使用强化学习模型控制月球着陆器

控制程序观前提醒:本章内容为训练一个强化学习模型,并使用强化学习模型控制月球着陆器。安装和运行DI-engine示例。 什么是DI-engine? DI-engine 是一个由 OpenDILab 提供的开源强化学习(Reinforcement Learning,简称RL&#xf…

一次职业院校漏洞挖掘

这个是之前挖掘到的漏洞,目前网站进行重构做了全新的改版,但是这个漏洞特别经典,拿出来进行分享。看到src上面的很多敏感信息泄露,所以自己也想找一个敏感信息泄露,官网如图: 发现在下面有一个数字校园入口…

电源滤波器怎么选用

电源滤波器怎么选用 滤波器应用场景及作用第一步:第二步:第三步:第四步: 滤波器应用场景及作用 可以有效解决EMC测试无法通过、端口防护、滤除干扰、设备保护等问题 主要功能有: 1、降低主电源谐波; 2、保护驱动装置电力电子元件…

硬币检测电路设计

一、来源:凡亿教育 第一场:硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p1&vd_source43eb1cb50ad3175d7f3b9385905cd88f 二、开发软件:KEIL MDK 三、主控芯片&#…

大型制造业集团IT信息化总体规划方案(65页PPT)

方案介绍: 本大型制造业集团IT信息化总体规划方案旨在通过构建先进、高效、稳定的IT信息化系统,支撑集团各业务领域的运营和管理需求,促进集团整体运营效率和竞争力的提升。通过实施本项目,集团将能够更好地应对市场变化和客户需…

嫁接打印:经济与实用的完美结合

在制造领域,寻求经济且好用的技术方案至关重要。而在模具制造中,3D 打印随形水路在提升冷却效率和产品良率方面的卓越表现已得到广泛认同。如何更经济的应用3D打印技术,就不得不说嫁接打印了。 在嫁接打印的制造过程中,产品的一部…

Uniapp写一个简单的商品瀑布流界面+商品详情

最终效果: 整体内容比较简单,参考了一篇瀑布流文章和一篇商品详情文章随便修改整了下,主要是给想做这方便面的新人一个简单逻辑的展示(其实我也是第一次写这个emmm) 一.组件下载: uni-icon uni-goods-nav…

InsightFace | 基于 AI 增强的人脸检测

点击下方卡片,关注“小白玩转Python”公众号 概述 我将使用InsightFace,这是一个以其在复杂面部分析任务中的卓越表现而闻名的开源AI工具包。该工具包可以帮助完成诸如人脸检测、关键点识别、情感识别、年龄和性别估算以及属性分析等任务。 示例 !pip in…

yolov10/v8 loss详解

v10出了就想看看它的loss设计有什么不同,看下来由于v8和v10的loss部分基本一致就放一起了。 v10的论文笔记,还没看的可以看看,初步尝试耗时确实有提升 好记性不如烂笔头,还是得记录一下,以免忘了,废话结束…

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程? 刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下: 1、客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文…

Pycharm的基础设置+Pycharm与AutoDL服务器连接

一.pycharm的基础设置 1.下载pycharm profession版,配置之前博客里面的解释器mask2 2.run detect.py 3.终端的设置 (1)先直接在终端里面pip install 我们再创建一个测试python文件:terninal_test.py 虽然上面安装成功了包&#x…

Nested KVM Hypervisor Support

Description Nested KVM是指基于虚拟化技术的虚拟机管理系统。 Nested KVM在Intel处理器上,KVM使用Intel的vmx(virtualmachine eXtensions)来提高虚拟机性能,即硬件辅助虚拟化技术。如果一台虚拟机能够和物理机一样支持vmx&…

秘塔AI搜索,看看如今的AI搜索能有多懂你

你们正在用的浏览器是哪一款? 平时搜索时是否也有过这样的经历,在搜索引擎里输入关键词,然后在一堆广告中大海捞针,一不小心就入了一刀999的坑,又或是陈年资料令人发懵,压根儿就别想找到宝藏资源&#xff…

【Qt秘籍】[007]-LineEdit Pushbutton控件

Qt的中有着各种各样的控件,相较于传统C/C的输出默认只能在控制台实现,Qt中可以有不同的接口实现各种不同的功能,下面我们将实现不同功能的输出 hello world! 标签Label 【Qt秘籍】[006]-Label实现Hello World程序-编程第一步-CSD…

Prime1 - 提权的另一种解法,彻底搞懂OpenSSL解密渗透提权,超强思路版。

提权枚举 现在我们直接从低权限用户开始;我们先按照提权步骤,简单的系统枚举 虽然我们知道可以利用系统版本低进行内核提权,内核提权虽然比较快比较方便,但也比较暴力,缺点非常明显;很容易导致系统服务中…

GIS结合物联网:塑造智慧地球的新篇章

在信息技术飞速发展的今天,地理信息系统(GIS)与物联网(IoT)的深度融合,正以前所未有的方式重塑着我们对世界的认知。本文将深入探讨GIS与物联网结合的原理、应用实践以及面临的挑战与未来展望,共…

刷代码随想录有感(88):贪心算法——加油站

题干&#xff1a; 代码&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int totalcost 0;for(int i 0; i < gas.size(); i){totalcost gas[i] - cost[i];}if(totalcost < 0)return -1;int …