intel深度相机 D455及D4系列入门教程(逐行代码讲解)

1.介绍

Intel RealSense D435、D455等D4系列:

Intel D4系列深度相机是由英特尔(Intel)公司推出的一款深度感知摄像头,专为实现计算机视觉和深度学习应用而设计。这款相机使用了英特尔的深度感知技术,结合了摄像头和红外(IR)传感器,可以提供高质量的深度图像和 RGB 彩色图像,为开发者提供了丰富的数据源,用于各种应用,包括虚拟现实(VR)、增强现实(AR)、手势识别、人脸识别、姿势识别、3D 扫描等。

以下是Intel D4系列深度相机的一些主要特点和优势:

1. 深度感知技术:

  • D4系列相机具备高质量的深度感知功能,能够获取场景中各个物体的精确距离信息,而不仅仅是RGB图像。

2. 多模式操作:

  • 相机支持多种操作模式,包括手势识别、人脸识别、物体追踪等。这使得它非常适合于需要人机交互的应用领域。

3. 低光环境适应:

  • D4系列深度相机在低光环境下也能够提供准确的深度信息,这使得它在各种不同的环境中都能够稳定工作。

4. 易于集成:

  • 相机提供了丰富的软件开发工具,开发者可以方便地将其集成到自己的应用中,快速开发深度感知应用。

5. 多平台支持:

  • D4系列深度相机支持多种操作系统,包括Windows、Linux等,也提供了各种开发语言的API,方便开发者在不同平台上使用。

6. 精准度和稳定性:

  • 相机具有高精度和稳定性,能够在不同距离范围内提供准确的深度信息,这对于需要精确度的应用非常重要。

结构光(Structured-light)
基本原理是,通过近红外激光器,将具有一定结构特征的光线投射到被拍摄物体上,再由专门的红外摄像头进行采集。这种具备一定结构的光线,会因被摄物体的不同深度区域,而采集不同的图像相位信息,然后通过运算单元将这种结构的变化换算成深度信息,以此来获得三维结构。通常采用特定波长的不可见的红外激光作为光源,它发射出来的光经过一定的编码投影在物体上,通过一定算法来计算返回的编码图案的畸变来得到物体的位置和深度信息。
结构光的优点主要有:
1)方案成熟,相机基线可以做的比较小,方便小型化。
2)资源消耗较低,单帧 IR 图就可计算出深度图,功耗低。
3)主动光源,夜晚也可使用。
4)在一定范围内精度高,分辨率高,分辨率可达 1280x1024,帧率可达 60FPS。
结构光的缺点:
1)容易受环境光干扰,室外体验差。
2)随检测距离增加,精度会变差。

2.初识深度相机

import pyrealsense2 as rs
import numpy as np
import cv2# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
# config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)# Start streaming
pipeline.start(config)try:while True:# Wait for a coherent pair of frames: depth and colorframes = pipeline.wait_for_frames()# 深度图depth_frame = frames.get_depth_frame()# 正常读取的视频流color_frame = frames.get_color_frame()if not depth_frame or not color_frame:continue# Convert images to numpy arraysdepth_image = np.asanyarray(depth_frame.get_data())color_image = np.asanyarray(color_frame.get_data())# print(f"depth_image shape: {depth_image.shape} color_image shape: {color_image.shape}")print(f"depth_image value: {depth_image}")   # 里面0值很多,还有很多1900左右的值      300mm 单位是毫米=30厘米=0.3米# depth_image shape: (480, 640) color_image shape: (480, 640, 3)# 深度图是单通道  颜色图是三通道的# Apply colormap on depth image (image must be converted to 8-bit per pixel first)# 在深度图像上应用colormap(图像必须先转换为每像素8位)depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)# Stack both images horizontallyimages = np.hstack((color_image, depth_colormap))# Show imagescv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)cv2.imshow('RealSense', images)key = cv2.waitKey(1)if key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()breakfinally:# Stop streamingpipeline.stop()

3.代码详解

pipeline = rs.pipeline()
config = rs.config()

rs.pipeline()rs.config()pyrealsense2库中的两个函数,用于创建一个深度摄像机数据流的通道(pipeline)和一个配置对象(config)。

rs.pipeline()函数返回一个管道对象,该对象可以用于操作由Intel RealSense深度相机生成的数据流。它允许您将相机的输入流(例如,颜色、深度或红外图像)与其他Python代码连接起来。在使用RealSense相机前,需要先创建一个管道对象。创建方式为:

 

pipeline = rs.pipeline()

rs.config()函数返回一个配置对象,用于配置深度相机中的参数。您可以使用配置对象设置数字和字母参数,例如相机分辨率、帧速率、输出格式等。在创建管道后,需要创建一个配置对象,以便为您的管道指定任何必需的属性。创建方式为:

config = rs.config()

要启用深度和颜色流,可以使用config.enable_stream()方法,在实例化配置对象之后调用。

config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

这里,我们启用了分辨率为640x480、帧速率为30fps的深度流和彩色流,并指定了它们的格式(rs.format.z16rs.format.bgr8)。

pipeline.start(config)

pipeline.start(config)是用于开始深度相机数据流的函数调用。在实例化管道对象和配置对象之后,需要调用start()方法来启动数据流。

具体来说,start()方法会将配置对象传递给管道对象,并开始捕获深度相机生成的数据。这样,您就可以从相机读取帧并对其进行处理。

pipeline.start(config)

这将根据提供的配置开始从深度相机读取数据帧。一旦启动数据流,您就可以使用wait_for_frames()方法等待并获取一对同步的深度帧和颜色帧进行后续处理。

请确保在调用start()方法之前已经正确配置了管道和配置对象。同时,确保在不再需要数据流时调用pipeline.stop()来停止数据流的捕获和处理。

 

frames = pipeline.wait_for_frames()# 深度图depth_frame = frames.get_depth_frame()# 正常读取的视频流color_frame = frames.get_color_frame()
frames = pipeline.wait_for_frames()

等待并获取一对同步的深度帧和彩色帧,wait_for_frames()方法在这里起到阻塞的作用,直到有新的数据帧可用才会继续执行。

depth_frame = frames.get_depth_frame()

frames中获取深度帧,深度帧包含了相机捕获的深度信息。

color_frame = frames.get_color_frame()

frames中获取彩色帧,彩色帧包含了相机捕获的彩色图像信息。

通过以上几行代码,您可以同时获取深度图和彩色帧,以进一步进行后续处理。请注意,在调用get_depth_frame()get_color_frame()之前,要确保已经调用了wait_for_frames()来获取最新的一对数据帧。

如果没有获取到有效的深度帧或彩色帧,返回的值将为None。因此,建议在使用这些帧之前进行有效性检查,以避免出现错误。

 

 if not depth_frame or not color_frame:continue

这是一个简单的错误检查,用于确保从深度相机中获取了有效的深度帧和彩色帧。如果depth_framecolor_frame中的任意一个为None,则会跳过当前循环,并等待下一次数据帧。这可以避免在没有有效数据的情况下继续执行一些后续操作,导致程序出错。

depth_image = np.asanyarray(depth_frame.get_data())color_image = np.asanyarray(color_frame.get_data())

 

这段代码用于将深度帧和彩色帧转换为numpy数组,以便进一步进行处理。

depth_image = np.asanyarray(depth_frame.get_data())

将深度帧转换为numpy数组形式。depth_frame.get_data()方法将深度帧中的像素数据返回为一个字节串(byte string),然后通过np.asanyarray()函数将其转换为numpy数组格式。

color_image = np.asanyarray(color_frame.get_data())

将彩色帧转换为numpy数组形式。color_frame.get_data()方法将彩色帧中的像素数据返回为一个字节串(byte string),然后通过np.asanyarray()函数将其转换为numpy数组格式。

一旦您将深度帧和彩色帧转换为numpy数组,就可以使用numpy库中的各种函数来对这些帧进行处理。例如,您可以使用numpy库中的矩阵操作函数来对深度图像进行处理,或者使用matplotlib库中的函数来显示彩色帧。

请注意,asanyarray()函数对任何输入都将返回数组视图(即指向原始数据的指针),除非无法安全地返回此类视图,否则不会进行复制。

# print(f"depth_image shape: {depth_image.shape} color_image shape: {color_image.shape}")print(f"depth_image value: {depth_image}")   # 里面0值很多,还有很多1900左右的值      300mm 单位是毫米=30厘米=0.3米# depth_image shape: (480, 640) color_image shape: (480, 640, 3)# 深度图是单通道  颜色图是三通道的

 

 

用于打印出深度图和彩色帧的一些基本信息,以便确认获取的数据是否正确。

print(f"depth_image shape: {depth_image.shape} color_image shape: {color_image.shape}")

打印出深度图和彩色帧的形状,即它们各自包含多少行和列。在这个例子中,深度图是单通道的,形状为(480, 640),而彩色帧则是三通道的,形状为(480, 640, 3)

print(f"depth_image value: {depth_image}")

打印出深度图像素值的数组,以便查看深度图中不同位置的像素值。深度图的像素值表示距离相机的距离,单位为毫米(mm)。因此,0代表相机无法检测到物体,而更大的值代表物体离相机越远。在打印的结果中,您可以看到很多0值和一些接近1900左右的值,这可能表示相机检测不到这些物体或者这些物体距离比较远。

# Apply colormap on depth image (image must be converted to 8-bit per pixel first)# 在深度图像上应用colormap(图像必须先转换为每像素8位)depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

 

在深度图像上应用色彩映射,使深度信息可视化。

depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
  • cv2.convertScaleAbs()函数用于将深度图像转换为8位图像。它通过将深度图像的像素值缩放到指定范围内,并取绝对值来确保结果是非负整数,然后将浮点型数据转换为8位无符号整数数据。
  • cv2.applyColorMap()函数用于将8位深度图像应用颜色映射。cv2.COLORMAP_JET参数指定了使用的颜色映射方案,其中JET表示将深度值映射到一种彩虹色的颜色表示。不同深度值将映射到不同的颜色。

最终,depth_colormap变量将包含应用颜色映射后的深度图像。这样,您就可以通过可视化的方式观察深度信息,不同深度值将以不同的颜色显示出来。

 

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

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

相关文章

vue3+elementPlus el-input的type=“number“时去除右边的上下箭头

改成 代码如下 <script lang"ts" setup> import {ref} from vue const inputBtn ref() </script> <template><el-input type"number" v-model"inputBtn" style"width: 80px;" class"no_number">…

WPS/word 表格跨行如何续表、和表的名称

1&#xff1a;具体操作&#xff1a; 将光标定位在跨页部分的第一行任意位置&#xff0c;按下快捷键ctrlshiftenter&#xff0c;就可以在跨页的表格上方插入空行&#xff08;在空行可以写&#xff0c;表1-3 xxxx&#xff08;续&#xff09;&#xff09; 在空行中输入…

毛玻璃 has 选择器卡片悬停效果

效果展示 页面结构 从上述的效果展示可以看到&#xff0c;页面是由多个卡片组成&#xff0c;并且鼠标悬停在卡片上时&#xff0c;会旋转用户图片并且韩式对应的用户信息框。 CSS3 知识点 :has 属性的运用 实现页面整体结构 <div class"container"><div…

RT-Thread 内存管理(学习二)

内存堆管理应用示例 这是一个内存堆的应用示例&#xff0c;这个程序会创建一个动态的线程&#xff0c;这个线程会动态申请内存并释放&#xff0c;每次申请更大的内存&#xff0c;当申请不到的时候就结束。 #include <rtthread.h>#define THREAD_PRIORITY 25 #defi…

conda安装使用jupyterlab注意事项

文章目录 一、conda安装1.1 conda安装1.2 常见命令1.3 常见问题 二、jupyterlab2.1 jupyterlab安装和卸载2.2 常见错误2.2.1 版本冲突&#xff0c;jupyterlab无法启动2.2.2 插件版本冲突 2.3 常用插件2.3.1 debugger2.3.2 jupyterlab_code_formatter 2.4 jupyter技巧 一、conda…

Docker数据管理

容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;Data Volume Dontainers&#xff09; Docker的数据管理 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&…

云服务器CVM_云主机_云计算服务器_弹性云服务器-腾讯云

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

微服务学习(十一):安装Git

微服务学习&#xff08;十一&#xff09;&#xff1a;安装Git 1、下载Git 官网下载Git 2、将下载后的资源包上传到服务器 3、解压并安装 tar -zxvf git-2.42.0.tar.gz4、安装依赖 yum install zlib yum install zlib-devel5、执行操作命令 cd /home/git/git-2.42.0 ./co…

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

使用springboot服务端远程调试? 试试HTTP实现服务监听

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 wi…

Linux 部署项目

部署 Linux 部署项目1. 宝塔部署1.1 前端部署1.2 后端部署 2. docker 部署2.1 后端部署2.2 前端部署 3. 跨域问题3.1 Nginx 代理&#xff08;推荐&#xff09;3.2 修改后端服务3.3 添加 web 全局请求拦截器 4. 域名解析DNSPod添加域名 Linux 部署项目 1. 宝塔部署 准备工作&am…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…