将深度相机的实时三维坐标数据保存为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_imageif __name__ == '__main__':# 设置计时器start_time = time.time()# 间隔时间,单位sstep_time = 0.5try: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和uyux, uy = int(boxes[i][0]), int(boxes[i][1])# 得到深度帧中的对应坐标处的距离dis = depth_frame.get_distance(ux, uy)# 将指定深度帧的像素坐标和距离值转化为相机坐标系下的坐标x,y,zcamera_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)# 将单位转化为mmcamera_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 windowif key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()pipeline.stop()# 保存实时数据到文件中savepath = 'E:\T\data.xls'data.save(savepath)breakfinally:# Stop streamingpipeline.stop()

三、excel结果显示

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

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

相关文章

RabbitMQ中Direct交换机的用法

前言:比如我们的支付完成之后需要进行修改支付状态还要完成短信通知用户需要同时并发两条指令我们可以使用direct交换机进行指定两个不同的业务去完成这两件事 比如我们现在有direct.queue1/direct.queue2两个消息队列,一个direct交换机 我们创建完成两…

鸿蒙开发之--生命周期

开发官网 开发-HarmonyOS开发者-华为开发者联盟 UIAbility生命周期 1、首先执行onCreate(),用于页面初始化和设置页面逻辑 2、执行onWindowStageCreate()创建一个窗口,在这里可以使windowStage.loadContent(url,()>{})打开一…

“拿来主义”学习无限滚动动画(附源码)

欢迎关注:xssy5431 小拾岁月 参考链接:https://mp.weixin.qq.com/s/xVTCwR1ZSn5goWmc2yimVA 动画效果 需求分析 需求中涉及无线滚动,说明需要使用 animation 动画。另外,为了方便用户点击操作,需要给滚动对象添加鼠标…

感谢我的辅导员—敬爱的罗老师

前言:快毕业了,想在毕业季感谢给予我帮助的老师,我的辅导员-罗老师是我最想感谢的大学老师。我不知道应该以什么样的方式去表达罗老师对我大学阶段的帮助,如果是直接发邮件,微信信息留言,可能在之后我和老师…

MySQL索引优化解决方案--索引优化(4)

排序优化 尽量避免使用Using FileSort方式排序。order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。where子句中如果出现索引范围查询会导致order by索引失效。 优化案例 联表查询优化 分组查询优化 慢查询日志

架构是怎样练成的-楼宇监控系统案例

目录 概要 项目背景 原系统设计方案 改进后的设计方案 小结 概要 绝大多数人掌握的架构都是直接学习,慢慢地才能体会到一个架构的好处。架构是一种抽象,是为了复用目的而对代码做的抽象。通过一个项目的改造,理解架构是如何产生的&…

Kubernetes Prometheus 系例 | kubernetes 部署 Kafka exporter监控Kafka集群

prometheus 监控 kafka 常见的有两种开源方案; 部署 exporter 或 jmx 配置监控。 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporter jmx_exporter:https://github.com/prometheus/jmx_exporter 本文采用kaf…

【日常记录】【JS】优雅检测用户是否在指定元素的外部点击

文章目录 1、界面基本布局2、代码实现3、参考链接 1、界面基本布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

搜索python包的说明

当我发现bug时&#xff0c;就怀疑是sns包的版本问题了&#xff08;原代码是原作者以前成功运行的代码&#xff09;&#xff0c;于是直接到网上搜&#xff0c;找到对应的说明文档 根据该示例代码进行改写&#xff1a; 达成目的。

【漏洞复现】用友 UFIDA saveDoc.ajax 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

ONLYOFFICE 8.1版本桌面编辑器测评

https://www.onlyoffice.com/zh/ 随着工作方式的不断演变&#xff0c;文档编辑软件成为了我们日常工作中不可或缺的一部分。而ONLYOFFICE作为一款开源且功能丰富的办公套件&#xff0c;其最新推出的8.1版本在原有基础上进行了大量的优化与更新&#xff0c;旨在提供更流畅、更安…

后端返回base64文件流下载

后端返回base64文件流: 前端处理&#xff1a; downloadTemplate () {this.$API.downloadTemplate().then(({ data }) > {const binaryString atob(data) // 解码base64字符串const byteArray new Uint8Array(binaryString.length) // 创建一个Uint8Arrayfor (let i 0; i…

2.优化算法之滑动窗口1

1.长度最小的子数组 . - 力扣&#xff08;LeetCode&#xff09; &#xff08;1&#xff09;题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;…

计算机视觉——opencv快速入门(一) opencv的介绍与安装

什么是opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它旨在提供广泛的图像和视频处理功能&#xff0c;支持多种编程语言&#xff08;主要包括C, Python, Java等&#xff09;和操作系统&#xff08;如Li…

生产环境:CentOS 7 Docker 20.10.19离线部署(为离线部署k8s做准备)

背景描述&#xff1a;离线部署Docker环境 在现代IT基础设施中&#xff0c;Docker已经成为应用容器化的标准工具。它简化了应用程序的部署和管理&#xff0c;使开发者和运维工程师能够以更高的效率和一致性进行工作。然而&#xff0c;在某些场景下&#xff0c;由于安全性、网络…

代码随想录算法训练营第三十四天|56. 合并区间、738.单调递增的数字、968.监控二叉树

56. 合并区间 题目链接&#xff1a;56. 合并区间 文档讲解&#xff1a;代码随想录 状态&#xff1a;无语&#xff0c;这题从右边界排序做不了&#xff01; 思路&#xff1a; 排序&#xff1a;按照区间的起始位置进行排序&#xff0c;这样后面处理时可以顺序合并重叠区间。合并…

数据结构-线性表的链式表示

目录 前言一、线性表的链式表示和实现1.1 线性表的表示1.2 基本操作的实现1.3 线性表的链式表示的优缺点 总结 前言 本篇文章主要介绍线性表的链式表示 一、线性表的链式表示和实现 1.1 线性表的表示 线性表的链式表示又称为链式存储结构或链式映像 链式存储定义&#xff1…

emlogpro文件上传漏洞代码审计(CVE-2023-44974)(CVE-2023-44973)

【产品介绍】 emlog 是 “Every Memory Log” 的简称&#xff0c;意即&#xff1a;点滴记忆。它是一款基于PHP语言和MySQL数据库的开源、免费、功能强大的个人或多人联合撰写的博客系统(blog)。基于PHP和MySQL的功能强大的博客及CMS建站系统。致力于提供快速、稳定&#xff0c…

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

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

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项…