使用深度相机D435i+YOLOv8实现物体三维坐标实时显示

一、获取相机内参

下列指令为获取相机内参指令,输入此指令前需要获得相机的深度帧和彩色帧数据。

如何使用vsCode打开intel D435i深度相机

# 获取相机内参
depth_intrinsics = depth_frame.profile.as_video_stream_profile().intrinsics
color_intrinsics = color_frame.profile.as_video_stream_profile().intrinsics
# 命令行打印相机内参显示
print("Depth Intrinsics:", depth_intrinsics)
print("Color Intrinsics:", color_intrinsics)

显示结果为:

Depth Intrinsics: [ 640x480  p[322.02 236.768]  f[391.288 391.288]  Brown Conrady [0 0 0 0 0] ]
Color Intrinsics: [ 640x480  p[328.884 240.065]  f[606.697 606.756]  Inverse Brown Conrady [0 0 0 0 0] ]

其中:640x480是像素宽度x像素高度; p[322.02 236.768]为主点(镜头光轴与图像平面的交点)的坐标; f[391.288 391.288]为焦距参数;Brown Conrady [0 0 0 0 0]分别表示畸变模型与畸变系数

二、关于 result.boxes.xywh.tolist()的xywh的解释

关于boxes = result.boxes.xywh.tolist(),可以在result源码里面找到相关的定义如下,可以看出相应的x,y为中心点坐标,w为宽度,h为高度

三、自动根据相机内参和xywh计算相应的深度数据

首先通过下列指令获取绘制的边框信息,包括中心点坐标x,y和边框宽度w,边框高度h

然后通过中心点的坐标计算相应点的深度距离,并利用rs.rs2_deproject_pixel_to_point(相机深度内参,点坐标,点深度)将其转化为相机坐标系下的x,y,z;最后实现单位转化,显示为以mm为单位的数据。

四、代码与结果展示

详细代码文件如下:

# 此程序用于实现视频分帧识别物体,并为所识别的物品添加矩形框,显示置信度、标签等,更新于2024/6/24
# 更新程序,用于显示实时三维坐标2024/6/24
import cv2
import numpy as np
import pyrealsense2 as rs
from ultralytics import YOLO  # 将YOLOv8导入到该py文件中

# 加载官方或自定义模型
model = YOLO(r"E:\Deep learning\YOLOv8\yolov8n.pt")  # 加载一个官方的检测模型
# model = YOLO(r"E:\Deep learning\YOLOv8\yolov8s.pt")  # 加载一个官方的检测模型
# model = YOLO(r"E:\Deep learning\YOLOv8\yolov8n-seg.pt")  # 加载一个官方的分割模型
# model = YOLO(r"E:\Deep learning\YOLOv8\yolov8n-pose.pt")  # 加载一个官方的姿态模型


# 深度相机配置
pipeline = rs.pipeline()  # 定义流程pipeline,创建一个管道
config = rs.config()  # 定义配置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)
pipe_profile = pipeline.start(config)  # 启用管段流
align = rs.align(rs.stream.color)  # 这个函数用于将深度图像与彩色图像对齐

def get_aligned_images():  # 定义一个获取图像帧的函数,返回深度和彩色数组
    frames = pipeline.wait_for_frames()  # 等待获取图像帧
    aligned_frames = align.process(frames)  # 获取对齐帧,将深度框与颜色框对齐
    depth_frame = aligned_frames.get_depth_frame()  # 获取深度帧
    color_frame = aligned_frames.get_color_frame()  # 获取对齐帧中的的color帧
    depth_image = np.asanyarray(depth_frame.get_data())  # 将深度帧转换为NumPy数组
    color_image = np.asanyarray(color_frame.get_data())  # 将彩色帧转化为numpy数组
   
    # 获取相机内参
    # 获取深度内参
    depth_intri = depth_frame.profile.as_video_stream_profile().intrinsics
    # 获取彩色内参
    color_intri = color_frame.profile.as_video_stream_profile().intrinsics
    # 命令行输出内参检查
    # print("Depth Intrinsics:",depth_intri)
    # print("Color Intrinsics:",color_intri)
    
    # cv2.applyColorMap()将深度图像转化为彩色图像,以便更好的可视化分析
    depth_colormap = cv2.applyColorMap(
                cv2.convertScaleAbs(depth_image, alpha=0.07), cv2.COLORMAP_JET)
    # 返回深度内参、对齐深度帧、彩色图像
    return depth_intri, depth_frame, color_image

if __name__ == '__main__':
    try:
        while True:
            depth_intri, depth_frame, color_image = get_aligned_images()  # 获取深度帧和彩色帧
            source = [color_image]
            # 轨迹追踪,persist=true表示数据储存
            # results = model.track(source, persist=True)
            results = model.predict(source, save=False)
            # 预测完后打印目标框
            for result in results:
                # 获取边框列表,其中每个边界框由中心点坐标、宽度、高度组成
                boxes = result.boxes.xywh.tolist()
                # 逐个绘图
                im_array = result.plot()
                
                for i in range(len(boxes)):  # 遍历boxes列表
                    # 将中心点坐标位置转化为整型,并赋值给ux和uy
                    ux, uy = int(boxes[i][0]), int(boxes[i][1])
                    # 得到深度帧中的对应坐标处的距离
                    dis = depth_frame.get_distance(ux, uy)
                    # 将指定深度帧的像素坐标和距离值转化为相机坐标系下的坐标x,y,z
                    camera_xyz = rs.rs2_deproject_pixel_to_point(
                        depth_intri, (ux, uy), dis)
                    # 将x,y,z转化成3位小数的Numpy数组
                    camera_xyz = np.round(np.array(camera_xyz), 3)
                    # 将单位转化为mm
                    camera_xyz = camera_xyz * 1000
                    #camera_xyz = np.array(list(camera_xyz)) * 1000
                    # 转化为一个列表
                    camera_xyz = list(camera_xyz)
                    # 在im_array上绘制圆形,圆心坐标为ux,uy,半径为4个像素
                    # 颜色为(255,255,255),线条宽度为5个像素
                    cv2.circle(im_array, (ux, uy), 4, (255, 255, 255), 5)  # 标出中心点
                    # 在im_array上绘制文本框,文本框内容为camera_xyz
                    # 位置为(ux + 20, uy + 10),0字体类型,0.5字体大小,255,255,255字体颜色
                    # 最后两个参数为线宽和线型
                    cv2.putText(im_array, str(camera_xyz), (ux + 20, uy + 10), 0, 0.5,
                                [225, 255, 255], thickness=1, lineType=cv2.LINE_AA)  # 标出坐标
            
            # 设置窗口,窗口大小根据图像自动调整
            cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
            # 将图像images显示在窗口中,这个显示的是带有追踪结果的图像
            cv2.imshow('RealSense', im_array)
            key = cv2.waitKey(1)  # 等待用户输入
            # Press esc or 'q' to close the image window
            if key & 0xFF == ord('q') or key == 27:
                cv2.destroyAllWindows()
                pipeline.stop()
                break
    finally:
        # Stop streaming
        pipeline.stop()

结果展示:

intel D435i相机实时测量显示物体三维坐标

五、参考学习博文

Realsense D435i 通过YOLOv5、YOLOv8输出目标三维坐标_yolov5+d435i-CSDN博客

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

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

相关文章

Bootstrap和Bagging算法以及衍生算法

1. Bootstrap算法 实际上就是一种针对小样本的无放回式的抽样方法,通过方差的估计可以构造置信区间。 其核心思想和基本步骤如下:   (1) 采用重抽样技术从原始样本中抽取一定数量(自己给定)的样本&#…

Python高压电容导电体和水文椭圆微分

🎯要点 🎯二维热传导二阶偏微分方程 | 🎯调和函数和几何图曲率 | 🎯解潮汐波动方程 | 🎯解静止基态旋转球体流体运动函数 | 🎯水文空间插值 | 🎯流体流动模拟求解器 | 🎯随机算法解…

网络构建关键技术_1.网络高可用设计

1.网络高可用性概述 随着网络快速发展及应用日益深入,各种核心和增值业务在网络上广泛部署,网络的作用愈来愈凸显出来。即使网络出现短时间中断,都可能对业务带来比较大的影响,甚至给企业造成一定程度的经济损失。因此&#xff0c…

【CT】LeetCode手撕—23. 合并 K 个升序链表

目录 题目1- 思路2- 实现⭐23. 合并 K 个升序链表——题解思路 3- ACM 实现 题目 原题连接:23. 合并 K 个升序链表 1- 思路 模式识别:合并 K 个链表 ——> 优先队列 思路 借助优先队列,每次从 k 个链表中,各取一个元素&…

全球开店7万家,711如何策划极致产品力?

引言:越来越多的中国企业家认识到“极致产品力正成为最重要、最核心的品牌战略,是 21 世纪全球商业的主战场”。 《极致产品力》日本策划方案落地班是一个产品策划实操课程,可以帮助企业找到增长路径、拿到产品方案。 现今,许多中…

分布式数据库垂直分片如何计算?

在复习分布式数据库这一部分时,发现垂直分片较难理解,上网上查找资料,也发现找不到,固在考试结束后将自己的理解记录下来。 垂直分片的计算总体上分为三个步骤;1、属性亲和度矩阵AA的计算;2、聚类亲和度CA矩阵的计算&a…

基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建

开源库&#xff1a;VTK9.3.0 开发工具&#xff1a;Visual Studio2017 开发语言&#xff1a;C 实现过程&#xff1a; void initImageActor(double* Matrix, double* center, vtkSmartPointer<vtkImageCast> pImageCast,vtkSmartPointer<vtkImageReslice> imageRe…

6.折半查找

折半查找 基本思路在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找;若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。不断重复上述查找过 程,直到查找成功…

数据结构——二分算法

二分查找 1. 在排序数组中查找元素的第一个和最后一个位置 代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/int binarySearch(int *nums, int numsSize, int target) {int l 0, r numsSize - 1; while (l <…

Kubernetes 中 ElasticSearch 中的 MinIO 审核日志

无论您是在本地还是在云中&#xff0c;您都希望确保以同构的方式设置工具和流程。无论在何处访问基础结构&#xff0c;您都希望确保用于与各种基础结构进行交互的工具与其他区域相似。 考虑到这一点&#xff0c;在部署您自己的 MinIO 对象存储基础架构时&#xff0c;深入了解您…

缓存雪崩、穿透、击穿的概念和如何避免

雪崩 概念 高并发请求多个key&#xff0c;此时多个key同时失效、不在缓存中&#xff0c;请求全部打到数据库&#xff0c;使数据库无法处理这么多的连接&#xff0c;导致数据库死机 如何避免 防止多个key同时过期&#xff0c;设置随机的过期时间不设置过期时间&#xff0c;有…

汽车抬头显示器HUD阳光倒灌实验太阳光模拟器

简述 HUD阳光倒灌实验是评估汽车抬头显示器&#xff08;HUD&#xff09;在强烈日照条件下的性能表现的一种测试方法。该实验通过模拟太阳光照射&#xff0c;检测HUD在阳光直射下的显示效果&#xff0c;以确保驾驶者在强烈日照下仍能清晰地看到HUD显示的信息&#xff0c;从而提…

【计算机视觉】人脸算法之图像处理基础知识(六)

图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表&#xff0c;它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性&#xff0c;以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…

ogg格式怎么转换为mp3?这四种转换方法非常好用!

ogg格式怎么转换为mp3&#xff1f;在当今数字化时代&#xff0c;音频文件格式的转换已经成为确保音频内容在各种设备和平台上无缝播放的至关重要的一环&#xff0c;尽管OGG格式拥有支持多声道的优势&#xff0c;但由于其使用率相对较低&#xff0c;这可能会在某些情况下导致兼容…

基于单片机的智能台灯控制系统

摘要&#xff1a; 文章设计一款单片机智能台灯控制系统&#xff0c;实现对台灯的手动和自动控制功能&#xff0c;以 STC89C52 单片机作为多功能智能台灯的主控制器&#xff0c;光电检测模块检测坐姿&#xff0c;红外传感器检测人体&#xff0c;光敏电阻检测光强&#xff0c;同…

数字人视频剪辑解决方案,个性化定制服务

如何高效、专业地剪辑出高质量的数字人视频&#xff0c;却成为众多企业面临的难题。针对这一挑战&#xff0c;美摄科技凭借其在人工智能、计算机视觉等领域的深厚积累&#xff0c;推出了面向企业的数字人视频剪辑解决方案&#xff0c;为企业带来前所未有的视频制作新体验。 一…

RN开发搬砖经验之—“Calculated frame index should never be lower than 0“崩溃问题分析

问题重现 崩溃堆栈&#xff1a; Back traces starts. java.lang.RuntimeException: java.lang.IllegalStateException: Calculated frame index should never be lower than 0at com.facebook.react.animated.NativeAnimatedModule$1.doFrameGuarded(NativeAnimatedModule.ja…

qt开发-12_QScrollArea

在 Qt 中&#xff0c;QScrollArea 是用于显示可以滚动内容的控件&#xff0c;通常用于处理视图中内容超出可见区域的情况。它提供了一种在有限的视窗内显示大量内容的解决方案&#xff0c;如显示大图像、长文本、多个小部件等。 常用方法和属性 setWidget(QWidget *widget)&am…

深入了解 GPT-4 和 ChatGPT 的 API---OpenAI Playground

文章目录 基本概念OpenAI API 提供的可用模型在 OpenAI Playground 中使用 GPT 模型 掌握GPT-4 和 ChatGPT 的 API 的使用方法&#xff0c;以便有效地将它们集成到 Python 应用程序中。首先&#xff0c;需要了解 OpenAI Playground。这将使你在编写代码之前更好地了解模型。接着…

Jenkins教程-8-上下游关联自动化测试任务构建

上一小节小节我们学习了一下Jenkins自动化测试任务发送测试结果邮件的方法&#xff0c;本小节我们讲解一下Jenkins上下游关联自动化测试任务的构建。 下面我们以一个真实的自动化测试场景来讲解Jenkins如何管理上下游关联任务的触发和构建&#xff0c;比如我们有两个jenkin任务…