将深度相机的实时三维坐标数据保存为excel文档(Python+Pyrealsense2+YOLOv8)

一、如何将数据保存为excel文档

1.excel文件库与相关使用

(1)导入相应的excel文件库,导入前先要进行pip安装,pip install xlwt

import xlwt  # 导入用于创建和写入Excel文件的库

(2) 建立一个excel文档,并在第0行写入标题

# 创建一个数据存储的excel文档
# 第一个参数为编码格式,第二个参数表示不压缩文档
data = xlwt.Workbook(encoding='utf-8', style_compression=0)
# 在这个excel文件里面建立一个工作表sheet,表名称为moveData
# cell_overwrite_ok表示单元格可以重新赋值
sheet = data.add_sheet('moveData', cell_overwrite_ok=True)
# 定义列的名称,并将其写入sheet表单
colume = ('标签', 'X坐标', 'Y坐标', 'Z坐标','日期')
for i in range(len(colume)):
    sheet.write(0, i, colume[i])

2.将三维坐标添加到excel文档中

(1)首先需要对YOLOv8识别结果进行对应的信息获取,得到识别物品名称和相应的三维坐标信息。

(2) 然后需要将相应的信息写入excel文档,写入时首先获取当前工作表有多少行,再在下一行进行写入。写入的第0列是标签,第1-3列是x、y、z坐标,第4列是时间,此处用datetime函数需要导入datetime库文件

# 获取当前工作表的长度信息
row_count = len(sheet.rows)
# 写入识别物体的名称到第row_count行
sheet.write(row_count, 0, name)
# 写入x,y,z坐标
for k in range(len(camera_xyz)):
   sheet.write(row_count, k+1, camera_xyz[k])
# 写入时间
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
sheet.write(row_count, len(camera_xyz)+1, current_time)

3.将excel文件进行保存

当遇到停止指令,即键盘输入Esc或Q时,则停止并保存数据文件到指定的地址——savepath

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()
    # 保存实时数据到文件中
    savepath = 'E:\T\data.xls'
    data.save(savepath)
    break

二、全部代码文件展示

# 此程序用于实现视频分帧识别物体,并为所识别的物品添加矩形框,显示置信度、标签等,更新于2024/6/24
# 更新程序,用于显示实时三维坐标2024/6/24
# 2024/6/25 更新了数据保存
import cv2
import numpy as np
import pyrealsense2 as rs
from ultralytics import YOLO  # 将YOLOv8导入到该py文件中
import xlwt  # 导入用于创建和写入Excel文件的库
from datetime import datetime  # 用于查看现在时间的库函数
import time  # 用于实现计时器的作用

# 加载官方或自定义模型
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)  # 这个函数用于将深度图像与彩色图像对齐

# 创建一个数据存储的excel文档
# 第一个参数为编码格式,第二个参数表示不压缩文档
data = xlwt.Workbook(encoding='utf-8', style_compression=0)
# 在这个excel文件里面建立一个工作表sheet,表名称为moveData
# cell_overwrite_ok表示单元格可以重新赋值
sheet = data.add_sheet('moveData', cell_overwrite_ok=True)
# 定义列的名称,并将其写入sheet表单
colume = ('标签', 'X坐标', 'Y坐标', 'Z坐标','日期')
for i in range(len(colume)):
    sheet.write(0, i, colume[i])

# 检验是否可以最终退出保存用
# for i in range(len(col)):
#     sheet.write(2, i, col[i])

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__':
    # 设置计时器
    start_time = time.time()
    # 间隔时间,单位s
    step_time = 0.5
        
    try:
        while True:
            depth_intri, depth_frame, color_image = get_aligned_images()  # 获取深度帧和彩色帧
            # 每0.5s做一次预测,并显示结果
            if time.time()-start_time >= step_time:
                start_time = time.time()
                
                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()
                    # 确定各各框对应的names编号
                    c = result.boxes.cls.numpy()
                    # 检查相应的返回的names编号
                    # print(c)
                    # 计算相应的深度信息,并绘制中心点和三维坐标
                    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)  # 标出坐标
                        name = result.names[c[i]]
                        # 检查用的代码
                        # print("name:", name)
                        # Data = [name, np.array(camera_xyz)]
                        # print("Data:", Data)
                        # print("x:",camera_xyz[1])
                        # print("len_Data:", len(Data))
                        row_count = len(sheet.rows)
                        # print("row_count:", row_count)
                        # 写入识别物体的名称
                        sheet.write(row_count, 0, name)
                        # 写入x,y,z坐标
                        for k in range(len(camera_xyz)):
                            sheet.write(row_count, k+1, camera_xyz[k])
                        # 写入时间
                        current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                        sheet.write(row_count, len(camera_xyz)+1, current_time)
                
                # 设置窗口,窗口大小根据图像自动调整
                cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
                # 将图像images显示在窗口中,这个显示的是带有追踪结果的图像
                cv2.imshow('RealSense', im_array)
                cv2.imwrite('E:\T\picture.png', 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()
                # 保存实时数据到文件中
                savepath = 'E:\T\data.xls'
                data.save(savepath)
                break
    finally:
        # Stop streaming
        pipeline.stop()

三、excel结果显示

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

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

相关文章

Python | Leetcode Python题解之第198题打家劫舍

题目: 题解: class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size len(nums)if size 1:return nums[0]first, second nums[0], max(nums[0], nums[1])for i in range(2, size):first, second second, max(first nu…

读AI新生:破解人机共存密码笔记12人工智能辩论

1. 言论 1.1. 对一个人终身职业的威胁,可能会使一个非常聪明的、通常很有思想的人说出一些话,但在进一步分析后,他们很可能希望收回这些话 1.2. 电子计算器在算术方面是“超人”,但是计算器并没有接管世界,因此&…

IMX6ULL SD卡启动uboot+kernel+rootfs

目录 1. 背景说明 2.SD卡启动 2.1准备条件 2.2 对SD卡分区格式化 2.3 制作sd卡镜像 3.效果测试 1. 背景说明 网络上绝大数教程,教大家把uboot烧录到SD卡,然后uboot启动后,通过TFTP下载kernel和设备树,然后通过nfs挂载文件系…

laravel的日志使用说明

文章目录 了解系统的默认支持多个通道时它们的关系如何使用驱动 了解系统的默认支持 Laravel 日志基于「 通道 」和 「 驱动 」的。那么这个通道是干嘛的?驱动又是干嘛的? 通道 : 1.它表示了某种日志格式化的方式(或可理解为某个…

理解CNN模型如何学习

深度学习模型常常被认为是不可解释的。但是人们正在探索不同的技术来解释这些模型内发生了什么。对于图像,由卷积神经网络学习的特征是可解释的。我们将探索两种流行的技术来理解卷积神经网络。 可视化中间层的输出 可视化中间层的输出将有助于我们理解输入图像如何…

办公软件的答案?ONLYOFFICE 桌面应用编辑器会是最好用的 Office 软件?ONLYOFFICE 桌面编辑器使用初体验

文章目录 📋前言🎯什么是 ONLYOFFICE🎯 主要功能介绍及 8.1 新功能体验🎯 在线体验📝最后 📋前言 提到办公软件,大家最常用的可能就是微软的 Microsoft Office 和国产的 WPS Office。这两款软件…

使用API有效率地管理Dynadot域名,为文件夹中的域名进行域名停放

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

解锁高效办公:ONLYOFFICE新版本8.1功能揭秘与个人实战体验

文章目录 💯ONLYOFFICE 桌面编辑器 8.1 ✍1 新增功能介绍✍2 轻松编辑器PDF文件🍓2.1 PDF新增编辑器操作🍓2.2 PDF新增表单操作 ✍3 用幻灯片版式快速修改幻灯片✍4 无缝切换文档编辑、审阅和查看模式✍5 改进从右至左语言的支持 & 新的本…

C++——布隆过滤器

目录 布隆过滤器的提出 布隆过滤器的概念 布隆过滤器的基本原理和特点 布隆过滤器的实现 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺陷 布隆过滤器使用场景 布隆过滤器的提出 在注册账号设置昵称的时候,为了保证…

【已解决】SpringBoot图片更新需重启服务器才能显示

问题描述 1、更新头像,并跳转回列表页,发现显示不出来 2、但是前端获取用户头像的信息是在加载页面就会被调用的,同时前端也不存在所谓的缓存问题,因为没有动这部分代码。 但查看响应是能获得正确的信息(前端打印图片…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本: 社区版(Community Edition,缩写为 CE&#x…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台,其在云原生应用开发和部署中具有广泛的应用。然而,由于一些安全或网络限制,一些组织可能选择在内部网络…

【踩坑】修复循环设置os.environ[‘CUDA_VISIBLE_DEVICES‘]无效

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 问题示例 for gpus in [0, 1, 2, 3, 4, 5, 6, 7]:os.environ[CUDA_VISIBLE_DEVICES] gpusprint(torch.cuda.get_device_name(0)) 始终将使用第…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么?二、Http的状态码有哪些?三、 HTTP与HTTPS有什么区别?四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别?六、GET与POST WebSock…

期货投机的操作

期货投机是一种高风险、高回报的投资方式,吸引着众多投资者参与。将深入探讨期货专业投机的操作秘诀,帮助投资者掌握必要的知识和技巧,在期货市场中驰骋。 一、期货专业投机的本质 期货投机是利用期货合约进行买卖,以赚取差价的一…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧:整体框架中间:Mamba块的细节右侧:螺旋扫描的细节 提出背景 论文:https://arxiv.org/pdf/2406.15910 代码:https://github.com/wongzbb…

JAVA【案例5-2】模拟默认密码自动生成

【模拟默认密码自动生成】 1、案例描述 本案例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。 2、案例目的 (1&#xff09…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

【详述】BP神经网络建模流程一步一步详述

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、BP神经网络的建模流程二、BP神经网络的建模分步讲解2.1.数据归一化2.2.数据划分2.3.网络结构设置2.4.网络训练2.5.训练效果评估 本文梳理BP神经网络的建模流程,供大家建模时进行借鉴。 一、BP神经…

循环神经网络——RNN

循环神经网络 在之前NLP基础章节-语言模型中我们介绍了 n n n 元语法,其中单词 x t x_t xt​ 在时间步 t t t 的条件概率仅取决于前面 n n n 个单词,若是想要将之前单词的影响也加入那么模型参数数量会指数级增长。但是可能之前的单词存在重要的信息…