基于intel D4系列深度相机 (D455)的单点测距和两点距离测量(代码讲解超详细)

news2025/5/25 9:23:09

目录

1.简介

 1.1 intel D4系列深度相机 (D455)

1.2结构光(Structured-light)

2.基于深度相机的单点测距和两点距离测量

2.1函数详解

2.2 全部代码


 

1.简介

 1.1 intel D4系列深度相机 (D455)

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. 精准度和稳定性:
相机具有高精度和稳定性,能够在不同距离范围内提供准确的深度信息,这对于需要精确度的应用非常重要。

1.2结构光(Structured-light)

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

2.基于深度相机的单点测距和两点距离测量

2.1函数详解

  1. rs.pipeline():创建一个相机管道对象。

    • 用法:pipeline = rs.pipeline()
    • 功能:创建一个相机管道对象,用于管理和控制相机的数据流。
  2. rs.config():创建一个相机配置对象。

    • 用法:config = rs.config()
    • 功能:创建一个相机配置对象,用于设置相机的参数。
  3. config.enable_stream(stream_type, width, height, format, fps):启用相机流。

    • 用法:config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
    • 功能:启用指定类型的相机流,设置流的分辨率、格式和帧率。
  4. pipeline.start(config):开始相机流。

    • 用法:pipeline.start(config)
    • 功能:根据指定的配置对象开始相机数据流。
  5. pipeline.wait_for_frames():等待一对连贯的深度和彩色帧。

    • 用法:frames = pipeline.wait_for_frames()
    • 功能:阻塞程序,等待并获取一对连贯的深度帧和彩色帧。
  6. frames.get_depth_frame():获取深度帧。

    • 用法:depth_frame = frames.get_depth_frame()
    • 功能:从帧集中获取深度帧。
  7. frames.get_color_frame():获取彩色帧。

    • 用法:color_frame = frames.get_color_frame()
    • 功能:从帧集中获取彩色帧。
  8. depth_frame.get_data():获取深度图像数据。

    • 用法:depth_image = np.asanyarray(depth_frame.get_data())
    • 功能:将深度帧的数据转换为numpy数组。
  9. color_frame.get_data():获取彩色图像数据。

    • 用法:color_image = np.asanyarray(color_frame.get_data())
    • 功能:将彩色帧的数据转换为numpy数组。
  10. depth_frame.profile.as_video_stream_profile().intrinsics:获取深度图的内参。

    • 用法:intrinsics = depth_frame.profile.as_video_stream_profile().intrinsics
    • 功能:获取深度图像的内参,包括相机的焦距、原点和畸变参数等。
  11. depth_frame.get_distance(x, y):获取指定像素位置的深度值。

    • 用法:depth_value = depth_frame.get_distance(x, y)
    • 功能:获取指定像素位置的深度值,单位为米。
  12. rs.rs2_deproject_pixel_to_point(intrinsics, [x, y], depth):将像素坐标转换为相机坐标系下的坐标。

    • 用法:point = rs.rs2_deproject_pixel_to_point(intrinsics, [x, y], depth)
    • 功能:根据内参和指定的像素坐标及深度值,将其转换为相机坐标系下的坐标。
  13. time.time():返回当前时间的时间戳。

    • 用法:current_time = time.time()
    • 功能:获取当前时间的时间戳,用于计算帧率。
  14. cv2.putText(image, text, org, fontFace, fontScale, color, thickness):在图像上绘制文本。

    • 用法:cv2.putText(color_image, f"FPS: {int(fps)}", (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
    • 功能:在图像上绘制指定文本,并设置字体、大小、颜色和粗细等属性。
  15. cv2.circle(image, center, radius, color, thickness):在图像上绘制圆形。

    • 用法:cv2.circle(color_image, (x1, y1), 5, (0, 0, 255), -1)
    • 功能:在图像上绘制指定位置和大小的圆形,并设置颜色和粗细等属性。
  16. cv2.line(image, pt1, pt2, color, thickness):在图像上绘制直线。

    • 用法:cv2.line(color_image, (x1, y1), (x2, y2), (255, 0, 0), 1)
    • 功能:在图像上绘制指定起点和终点的直线,并设置颜色和粗细等属性。
  17. cv2.imshow(window_name, image):显示图像窗口。

    • 用法:cv2.imshow('Depth and Color Image', color_image)
    • 功能:创建一个指定名称的图像窗口,并显示图像。
  18. cv2.waitKey(delay):等待键盘输入。

    • 用法:key = cv2.waitKey(1)
    • 功能:等待指定毫秒数的键盘输入,并返回按下的键值。
  19. cv2.destroyAllWindows():关闭所有图像窗口。

    • 用法:cv2.destroyAllWindows()
    • 功能:关闭所有打开的图像窗口。

2.2 全部代码

import pyrealsense2 as rs
import numpy as np
import cv2
import time

# 初始化相机
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, 60)  # 设置彩色图像流参数
profile = pipeline.start(config)

pTime = 0

# 等待深度传感器稳定
for i in range(20):
    pipeline.wait_for_frames()

try:
    while True:
        # 等待一对连贯的帧:深度和彩色
        frames = 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

        # 将图像转换为numpy数组
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        # 获取深度图的内参
        intrinsics = depth_frame.profile.as_video_stream_profile().intrinsics

        # 第一个点的像素坐标
        x1, y1 = 320, 240
        # 第二个点的像素坐标
        x2, y2 = 400, 240

        # 在彩色图上绘制第一个点
        cv2.circle(color_image, (x1, y1), 5, (0, 0, 255), -1)  # 红色圆点
        # 在彩色图上绘制第二个点
        cv2.circle(color_image, (x2, y2), 5, (0, 255, 0), -1)  # 绿色圆点

        # 获取第一个点的深度值
        depth1 = depth_frame.get_distance(x1, y1)
        print(depth1)
        # 获取第二个点的深度值
        depth2 = depth_frame.get_distance(x2, y2)

        # 将像素坐标转换为相机坐标系下的坐标
        point1 = rs.rs2_deproject_pixel_to_point(intrinsics, [x1, y1], depth1)
        point2 = rs.rs2_deproject_pixel_to_point(intrinsics, [x2, y2], depth2)

        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        # 在彩色图上显示帧率
        cv2.putText(color_image, f"FPS: {int(fps)}", (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)

        # 计算单点的距离
        dist1 = depth_image[int(y1), int(x1)] / 1000  # 将深度值从mm转换为m
        cv2.putText(color_image, f"Dis1: {dist1:.2f}m", (int(x1 - 100), int(y1 - 20)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        dist2 = depth_image[int(y2), int(x2)] / 1000  # 将深度值从mm转换为m
        cv2.putText(color_image, f"Dis2: {dist2:.2f}m", (int(x2), int(y2 - 20)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        # 计算两点之间的空间距离
        distance = np.linalg.norm(np.array(point2) - np.array(point1))
        cv2.line(color_image, (x1, y1), (x2, y2), (255, 0, 0), 1)
        cv2.putText(color_image, f"Dis: {distance:.2f}m", (int(x2 - 100), int(y2 + 50)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        # 显示彩色图像
        cv2.imshow('Depth and Color Image', color_image)

        key = cv2.waitKey(1)
        # 按下q键或Esc键,关闭图像窗口
        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break

finally:
    # 停止相机流
    pipeline.stop()

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

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

相关文章

有人因它丢掉offer!背景调查到底有什么魔力?

求职时,公司往往会对应聘者过往经历做一些背景调查——也被叫做背调。 据i背调人才研究院数据显示,2022年的求职失信占比仍然较高,有39.13%的候选人存在职业信用异常。而随着近些年来,整体就业市场和职业发展中竞争压力不断加剧&…

间歇性微服务问题...

在Kubernetes环境中,最近由于特定配置导致Pod调度失败。哪种 Kubernetes 资源类型(通常与节点约束相关)可能导致此故障,尤其是在未正确定义的情况下? 节点选择器资源配额优先级污点Pod 中断预算 已有 201 人回答了该…

【学习之路】Multi Agent Reinforcement Learning框架与代码

【学习之路】Multi Agent Reiforcement Learning框架与代码 Introduction 国庆期间,有个客户找我写个代码,是强化学习相关的,但我没学过,心里那是一个慌,不过好在经过详细的调研以及自身的实力,最后还是解…

A星寻路优化方案

1.存储常用位置间的路径信息(此优化方案一般用于地图较大,且起始点离终点较远情况下) 对于地图信息已知且各障碍位置固定的情况下,可以将常用的位置及其之间的路径信息保存,然后寻路时分别找到离开始点,结…

【JUC】原子操作类及LongAddr源码分析

文章目录 1. 十八罗汉2. 原子类再分类2.1 基本类型原子类2.2 数组类型原子类2.3 引用类型原子类2.4 对象的属性修改原子类2.5 原子操作增强类 3. 代码演示及性能比较:4. LongAddr原理5. LongAddr源码分析5.1 add()5.2 longAccumulate()5.3 sum() 6. 小总结6.1 Atomi…

【JUC】CAS原理

CAS原理 文章目录 CAS原理1. 概述2. 原理3. Unsafe4. CAS与自旋锁 1. 概述 compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数一一内存位置、预期原值及更新值 执行CAS操作的时候,将内存位置的值与预期原…

和鲸 × 北中医:高规格、高并发,一场真正的人工智能分析应用临场实践考核

百舸争流,奋楫者先,2023 年,人工智能已逐渐成为引发千行百业产生颠覆性变革的前沿技术。随着人工智能时代的加速到来,我国政产学研各界对于创新型、复合型 AI 人才的能力要求正不断提升。 面对一批又一批激流勇进、乘风破浪的莘莘…

【Leetcode】 738. 单调递增的数字

当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 示例 2: 输入: n 1234 输出: 1234 示例3 : …

精通Maven的捷径:一文包揽所有必知必学

Maven是每个Java程序都会遇到的包管理工具&#xff0c;今天整理一下Maven的相关知识&#xff0c;从青铜到王者&#xff0c;一文全了解&#xff0c;我们开始吧&#xff01; 1、maven是什么&#xff0c;为什么存在&#xff1f;项目结构是什么样子&#xff0c;怎么定位jar 官方网…

【ROS】ros-noetic和anaconda联合使用【教程】

【ROS】ros-noetic和anaconda联合使用【教程】 文章目录 【ROS】ros-noetic和anaconda联合使用【教程】1. 安装anaconda2. 创建虚拟环境3. 查看python解释器路径4. 在虚拟环境中使用任意的包5. 创建工作空间和ros功能包进行测试Reference 1. 安装anaconda 在Ubuntu20.04中安装…

统一观测丨使用 Prometheus 监控 SQL Server 最佳实践

作者&#xff1a;啃唯 SQL Server 简介 SQL Server 是什么&#xff1f; Microsoft SQL Server 是 Microsoft 推出的关系型数据库解决方案&#xff0c;支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。Microsoft SQL Server 是市场领先的数据库技术之一。 SQL S…

【算法-动态规划】最长上升子序列-力扣 300

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

无限连接:前端跨页面通信的实现与应用

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 前端跨页面通信的概述 2. 前端跨页…

RunnerGo测试平台,无代码玩转UI自动化测试

首先需要进入官网&#xff0c;RunnerGo支持开源&#xff0c;可以自行下载安装&#xff0c;也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化 进入到测试页面 创建元素 我们可以在元素管理中创建我们测试时需要的元素 这里我们以…

PPT制作软件哪个好?各种类型的10款好用PPT软件盘点!

想必大家对PPT并不陌生&#xff0c;它在日常的工作或学习中有诸多应用场景&#xff0c;小到制作一份电子相册&#xff0c;大到一场产品发布会&#xff0c;都可以看到PPT的影子。 如果我们细究PPT的话&#xff0c;会发现可以细分出各种类型的PPT软件&#xff0c;诸如&#xff1…

Linux指令集合

磁盘相关命令 df//查看磁盘整体状况df -h //查看磁盘整体状况du //查看磁盘使用情况&#xff0c;如果不加目录&#xff0c;默认为当前目录du -h -d 0//表示我们只希望看当前目录磁盘使用情况&#xff0c;不会继续展示这层目录的下一级目录 du -h -d 1//表示展示当前目录的下一…

微信自动批量添加好友的方法

在现在的营销中微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能&#xff0c;需要运营者一个一个手动去添加&#xff0c;这样太过于浪费时间&#xff0c;并且加频繁了还容易被封号&#xff0c;今天给大家介绍几种手动批量加好友的方式以及怎么借助第三方软…

深入理解AQS之ReentrantLock源码分析

开题&#xff1a;如何自己生成一把独占锁&#xff1f; 1. 管程 — Java同步的设计思想 管程&#xff1a;指的是管理共享变量以及对共享变量的操作过程&#xff0c;让他们支持并发。 互斥&#xff1a;同一时刻只允许一个线程访问共享资源&#xff1b; 同步&#xff1a;线程之间…

【测试】丝滑版本测试记录2023-10-13

目录 四组24个视频拉取 视频拉取的带宽 本地内存不足 四组24个视频拉取 视频拉取的带宽 本地内存不足 由于 edge需要内存大几百M,加截wasm要更多一点&#xff0c;只剩下 400M,不足以使用

git+gitee代码上传

gitgitee代码上传 1、git应用工具下载安装 gitee应用注册并创建仓库点创建后进入到仓库 git命令关于.gitignore只执行一次的命令经常执行的命令 1、git应用工具 下载安装 https://git-scm.com/downloads $ git --version git version 2.39.0.windows.2代码仓库&#xff1a; …