将深度相机的实时三维坐标数据保存为excel文档

一、如何将数据保存为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/pingmian/37601.shtml

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

相关文章

web安全渗透测试十大常规项(一):web渗透测试之Fastjson反序列化

渗透测试之Java反序列化 1. Fastjson反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411.3.2.2 fastjson-1.2.42 版本绕过1.3.2.3 fastjson…

C++调试技巧总结

1.调试准备 常用调试 Crash调试 调试信息: Windows系统:符号单独PDB文件/链接时生成,从外部的符号服务器下载。(微软) LInux: 调试符号与目标模块在一个文件内,编译时产生调试信息。模块发布时…

手机数据恢复篇:如何在OPPO中恢复永久删除的视频?

说到丢失重要的记忆,如何在OPPO设备中恢复永久删除的视频是一个经常困扰许多用户的话题。意外删除重要视频的情况并不少见,对许多人来说,意识到它们已经消失可能很困难。但是,在正确的指导、方法和工具的帮助下,可以找…

运行CDN

背景 CDN代码,调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径,在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …

性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!

文章目录 一、什么是垃圾回收二、Java 内存区域划分三、垃圾回收算法1. 标记-清除(Mark-Sweep)算法2. 复制(Copying)算法3. 标记-整理(Mark-Compact)算法4. 分代收集(Generational Collecting&a…

[XYCTF新生赛2024]-PWN:EZ2.0?(arm架构,arm架构下的系统调用)

查看保护 查看ida 完整exp: from pwn import*pprocess(./arm) premote(gz.imxbt.cn,20082) svc0x0001c58c mov_r2_r4_blx_r30x00043224 pop_r70x00027d78 pop_r40x000104e0 pop_r30x00010160 pop_r10x0005f824 pop_r00x0005f73c sh0x0008A090payloadba*0x44 payloa…

cesium使用cesium-navigation-es6插件创建指南针比例尺

cesium-navigation-es6 是一个为 Cesium.js 提供导航控件的库,它提供了一些常见的用户界面组件,用于在 Cesium 场景中实现用户导航和交互。下面将介绍如何在项目中使用 cesium-navigation-es6。 使用步骤 1. 安装 cesium-navigation-es6 首先&#xf…

环回接口处理 IP 数据报的过程及 Loopback 接口的主要作用

环回接口处理 IP 数据报的过程 IPv4 中 传给环回地址(127.0.0.1)的任何数据均作为 IP 输入,直接送到环回接口(环回:IP 输入队列)。 传给广播地址或多播地址的数据报,会复制一份传给环回接口&…

七人团购新风尚:数字化时代的购物革命

在数字化时代的浪潮中,购物方式正经历着前所未有的变革。其中,七人团购模式以其独特的互动性和价值共享理念,为消费者带来了全新的购物体验。下面,我们将深入探讨这一模式的运作机制,以及它如何为标价599元的热销商品创…

WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)

0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…

自养号测评助力:亚马逊、沃尔玛电商高效测评补单技巧,轻松实现销量与补单双赢

要在竞争激烈的市场中通过测评补单的方式提升产品权重和销售,构建一个稳定且高效的测评补单系统至关重要。通过精心培养一批高质量的买家账号,并深入了解真实买家的行为数据,结合对风控数据的精准把控,我们能够自主推动推广进程&a…

循环神经网络——RNN

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

58岁TVB前视后近况曝光

众所周知,不少早年的TVB视帝视后如今在内地都很吃香,就比如说今年58岁的邓萃雯(雯女)。 近日由她与演员赵文瑄、张凯丽等合演的话剧《鳄鱼》在内地巡回演出,吸引了大批粉丝到场支持,不过就在雯女准备进入演…

vue3 动态配置element 的table

需求 合并行、合并标题、列宽可调整、列顺序可调整、可以控制列是否显示、列布局可保存、导出excel… 参考效果 代码 引入 npm i xlsx npm install element-plus --savetable组件 <template><div><div class"table-btn"><el-tooltip conte…

手写一个基于SpringBoot的MVC架构,默认实现CRUD和导入导出功能

文章目录 前言正文一、项目结构二、技术点三、部分核心代码3.1 core-tool 中的核心代码3.1.1 所有实体的通用父类 SuperEntity3.1.2 所有枚举的父接口 BaseEnum3.1.3 所有业务异常的父接口 BaseException 3.2 mvc-tool 中的核心代码3.2.1 CrudController 接口定义3.2.2 默认的C…

编译原理必考大题:子集法将NFA转换为DFA【详细讲解,真题实战】

写在最前&#xff0c;本文为实战向&#xff0c;解决问题的求法&#xff0c;理论基础见我的上一篇博客,当然了&#xff0c;只做题的话&#xff0c;看这个就够用了 文章目录 NFA转换为DFA如何求ε-闭包&#xff1f;如何求状态转换弧集?NFA转换为DFA的方法论真题实战例题一例题二…

MySQL学习(3):SQL语句之数据定义语言:DDL

1.SQL通用语法与分类 &#xff08;1&#xff09;通用语法 &#xff08;2&#xff09;分类 2.DDL 2.1数据库操作 show DATABASES; #查询所有数据库select DATABASE(); #查询当前数据库create DATABASE 数据库名称 [default charest 字符集] [collate 排列规则]; #default cha…

[NeurIPS2021] Deep Residual Learning in Spiking Neural Networks【文献精读、翻译】

深度残差学习在脉冲神经网络中的应用 Fang W, Yu Z, Chen Y, et al. Deep residual learning in spiking neural networks[J]. Advances in Neural Information Processing Systems, 2021, 34: 21056-21069. 摘要 深度脉冲神经网络 (SNNs) 因为使用离散的二进制激活和复杂的时…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…