c++数据保存到.csv文件中,并用opencv离线仿真显示

news2025/1/11 7:41:46

测试可能不是很方便,希望采集一次数据后期还可以使用,这里提供一个案例:

数据写入fosepose.csv

//write.cpp
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdint>
#include <chrono>
#include <thread>

// 定义 FusePose 结构体
typedef struct FusePose_ {
    uint64_t time_stamp;
    float x;
    float y;
    float yaw;
} FusePose;

// 函数来写入 FusePose 数据到 CSV 文件
void writeToCSV(const std::string& filename, const FusePose& pose) {
    std::ofstream file;

    // 打开文件以追加模式
    file.open(filename, std::ios::app);

    if (!file.is_open()) {
        std::cerr << "无法打开文件 " << filename << std::endl;
        return;
    }

    // 将数据写入文件
    file << pose.time_stamp << ','
         << std::fixed << std::setprecision(6) << pose.x << ','
         << std::fixed << std::setprecision(6) << pose.y << ','
         << std::fixed << std::setprecision(6) << pose.yaw << '\n';

    file.close();
}

int main() {
    std::string filename = "fosepose.csv";
    
    // 打开 CSV 文件并写入表头
    std::ofstream file;
    file.open(filename, std::ios::trunc);
    if (file.is_open()) {
        file << "time_stamp,x,y,yaw\n";
        file.close();
    }

    // 模拟接收实时数据的循环
    while (true) {
        // 生成模拟的 FusePose 数据
        FusePose pose;
        pose.time_stamp = std::chrono::system_clock::now().time_since_epoch().count();
        pose.x = static_cast<float>(rand()) / RAND_MAX * 10.0f; // 模拟 x 值
        pose.y = static_cast<float>(rand()) / RAND_MAX * 10.0f; // 模拟 y 值
        pose.yaw = static_cast<float>(rand()) / RAND_MAX * 360.0f; // 模拟 yaw 值

        // 将数据写入 CSV 文件
        writeToCSV(filename, pose);

        // 等待 1 秒钟再接收下一条数据
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}


读数据,并显示

//read.cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <opencv2/opencv.hpp>

// 定义 FusePose 结构体
typedef struct FusePose_ {
    uint64_t time_stamp;
    float x;
    float y;
    float yaw;
} FusePose;

// 从 CSV 文件中读取 FusePose 数据
std::vector<FusePose> readFusePosesFromCSV(const std::string& filename) {
    std::vector<FusePose> poses;
    std::ifstream file(filename);
    std::string line;

    if (!file.is_open()) {
        std::cerr << "无法打开文件 " << filename << std::endl;
        return poses;
    }

    // 跳过表头
    std::getline(file, line);

    while (std::getline(file, line)) {
        std::istringstream iss(line);
        std::string token;
        FusePose pose;

        std::getline(iss, token, ',');
        pose.time_stamp = std::stoull(token);

        std::getline(iss, token, ',');
        pose.x = std::stof(token);

        std::getline(iss, token, ',');
        pose.y = std::stof(token);

        std::getline(iss, token, ',');
        pose.yaw = std::stof(token);

        poses.push_back(pose);
    }

    file.close();
    return poses;
}

int main() {
    std::string filename = "fosepose.csv";
    auto poses = readFusePosesFromCSV(filename);

    // 使用 OpenCV 创建一个窗口来显示结果
    cv::namedWindow("Pose Points", cv::WINDOW_NORMAL);
    cv::Mat image = cv::Mat::zeros(800, 800, CV_8UC3); // 创建一个 800x800 的黑色图像

    // 绘制点
    for (const auto& pose : poses) {
        // 假设 x 和 y 的值在 0 到 10 之间,将它们映射到图像坐标中
        int x_pos = static_cast<int>(pose.x * 80); // 映射 x 到图像宽度范围
        int y_pos = static_cast<int>(pose.y * 80); // 映射 y 到图像高度范围

        // 使用绿色绘制点
        cv::circle(image, cv::Point(x_pos, 800 - y_pos), 5, cv::Scalar(0, 255, 0), -1);
    }

    // 显示图像
    cv::imshow("Pose Points", image);
    cv::waitKey(0); // 等待用户按键

    return 0;
}

//g++ -o readshow readshow.cpp  `pkg-config --cflags --libs opencv4`

效果

在这里插入图片描述

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

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

相关文章

达梦数据库的系统视图v$sql_plan

达梦数据库的系统视图v$sql_plan 达梦数据库的V$SQL_PLAN视图主要用于显示缓存中的SQL执行计划信息&#xff0c;在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图&#xff0c;用户可以获取到缓存中的SQL语句的执行计划&#xff0c;这对于监控和分析数据库中的SQL执行情…

excel去掉小数点前的内容

可以使用"通配符"法 1、去除小数点后的内容 我们按CTRLH&#xff0c;调出查找替换功能 然后在查找内容里面&#xff0c;输入.* 星号是通配符&#xff0c;一点加通配符&#xff0c;表示将小数点后面的任意字符给去掉 2、去除小数点前的内容 我们按CTRLH&#xff0c;调…

Python处理和生成 Word 文档库之python-docx使用详解

概要 在日常工作中,处理和生成 Word 文档是一个常见的需求。Python 提供了一个强大的库 python-docx,使得操作 Word 文档变得简单和高效。python-docx 可以帮助我们创建、修改和读取 Word 文档,适用于各种应用场景,如自动化报告生成、批量文档处理等。本文将详细介绍 pyth…

Spring AOP:面向切面编程的最佳实践 ( 一 )

1.AOP思想 1.1.为什么需要面向切面编程 如果在一个类或者多个类的多个业务逻辑方法中, 在开始,结尾部分包含功能相同的代码称之为横切关注点也叫切面, 这种结构可能符合传统的面向对象编程&#xff08;OOP&#xff09;的封装特性, 但可能导致代码难以维护和扩展。 面向切面编…

Python 如何进行自然语言处理(NLTK, SpaCy)

自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学和人工智能的一个重要领域&#xff0c;旨在实现计算机对人类语言的理解和处理。在Python中&#xff0c;有许多工具和库可以用于自然语言处理&#xff0c;其中最流行的两个是NLTK&#xff08;…

【Python脚本】定时任务脚本实现、自动关机等功能脚本实现(保姆篇)

文章目录 功能描述源码分析依赖参数配置数据校验多线程并发执行定时任务注册自动关机主程序 源码整合本篇小结 更多相关内容可查看 功能描述 需要python环境&#xff0c;详情可看主页python相关文章【Python】从0开始写脚本、Selenium详细教程、附源码案例&#xff08;保姆篇&…

3dsMax模型展开UV之后无法删除,3dsmax删除模型上已经展开的UV

3dsmax展开UV之后如何删除UV 方法二 如果不能重置UV通道&#xff0c;在实用工具》更多工具》UVW移除&#xff0c;选中模型&#xff0c;点击UVW移除&#xff0c;移除模型的UVW。

机器人抓取与操作的挑战与进展——挑战赛角度

从竞赛中看机器人抓取与操作的挑战与进展 前言一、国际机器人竞赛有哪些&#xff1f;二、感知方面的挑战与进展二、抓取方面的挑战与进展三、操作方面的挑战与进展总结 前言 本文根据最近的机器人抓取和操作挑战赛 (Robotic Grasping andManipulation Competitions (RGMCs))&a…

OCR图片矫正、表格检测及裁剪综合实践

问题描述 实际工程中&#xff0c;我们经常需要对图片进行预处理&#xff0c;比如&#xff1a; 1、图片是倾斜的 2、图片背景需要处理掉 3、图片的公章需要剔除 4、图片过暗&#xff0c;过亮 5、图片表格检测 6、图片表格版面分析 。。。。。。等等各种情况。 结果展示…

解决PuppeteerSharp生成PDF颜色问题的最佳实践

在现代网络开发中&#xff0c;使用爬虫技术生成PDF文件已成为一种常见需求。然而&#xff0c;开发者经常会遇到一些棘手的问题&#xff0c;其中之一便是使用PuppeteerSharp生成PDF时颜色丢失的问题。本篇文章将概述如何解决这一问题&#xff0c;并提供最佳实践和相关代码示例。…

TI音频功放TAS6511(二)

3.数字音频处理 芯片支持高级数字音频处理能力&#xff0c;包括&#xff1a; 高通滤波器/直流阻断 数字音量控制 PVDD的Foldback/AGL 热Foldback 双象限增益补偿 混合调制 实时负载诊断 低延迟路径 喇叭功率限制 1&#xff09;PVDD Foldback 本功能主要为了防止音频…

学习笔记--算法(双指针)2

复写零 链接&#xff1a;https://leetcode.cn/problems/duplicate-zeros/ 题目 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的…

分享一个基于微信小程序的旅游自助拼团系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

想业余时间做个网赚项目,有啥捷径?

前两年我陷入一段迷茫、浮躁、焦虑期。 主要原因是&#xff0c;心很大&#xff0c;力不足。 总想着找到一个高利润、高复购、少竞争的“蓝海”产品。 于是就面临一个尴尬的境地&#xff1a;普通业务看不上&#xff0c;蓝海业务找不着。 而且总想着做推广一步登天&#xff0…

程序员日志之DNF手游女鬼剑前瞻

目录 传送门正文日志1、概要女鬼剑 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09; MyBatis-Plus SpringDataJPA SpringClou…

【教资 · 科目一】综合素质

【科目一】综合素质 单选题&#xff1a;29道/2分&#xff0c;共58分材料分析题&#xff1a;3道/14分&#xff0c;共42分写作题&#xff1a;1道&#xff0c;50分 卷面满分150分 —— 报告满分120分 及格分数99分以上 —— 及格分数70分 ‍ 考试内容&#xff1a; 职业理念&a…

Flink笔记整理(七)

Flink笔记整理&#xff08;七&#xff09; 文章目录 Flink笔记整理&#xff08;七&#xff09;九、容错机制9.1 检查点&#xff08;Checkpoint&#xff09;检查点的保存从检查点恢复状态检查点算法9.2 状态一致性9.3 端到端精确一次&#xff08;End-To-End Exactly-Once&#x…

中科亿海微SoM模组——光纤陀螺控制板

光纤陀螺控制板 光纤陀螺仪是一种高精度、高可靠性的惯性测量仪器&#xff0c;被广泛应用于导航、姿态控制等应用场景&#xff0c;具有非常重要的应用价值。 本文介绍的光纤陀螺控制板是基于中科亿海微自研的SiP芯片平台&#xff0c;以及光纤陀螺数字信号处理流程&#xff0c…

安泰高压功率放大器的作用以及应用有哪些

高压功率放大器是一种用于增强信号强度的电子设备。它的作用是将输入信号的功率放大到足够的水平&#xff0c;以便在系统中进行传输或执行特定的任务。高压功率放大器在各种领域都有广泛的应用&#xff0c;从通信到科学研究再到医疗设备等多个领域都可以找到其身影。 高压功率放…

echarts横向柱状图

一、效果图 二、代码 let option {grid: {top: 8%,bottom: -20,right: 20,left: 20,containLabel: true},xAxis: {show: false},yAxis: [{triggerEvent: true,show: true,inverse: true,data: getArrByKey(data, name),axisLine: {show: false},splitLine: {show: false},axi…