一种时间戳对齐的方法(离线)

这段代码的主要功能是:

  1. 读取指定目录下的 pcd 文件和 jpg 文件。
  2. 对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。
  3. 将找到的 jpg 文件复制到对应的输出目录,实现时间戳对齐。

这种时间戳对齐的操作在多传感器数据融合中非常常见,它确保了不同传感器采集的数据在时间上是同步的,方便后续的数据处理和分析。

 time_align.cpp

#include <iostream>
#include <string>
#include <vector>
#include <filesystem>
#include <algorithm>namespace fs = std::filesystem;std::vector<std::string> get_file_names(const std::string& dir_path, const std::string& ext) {std::vector<std::string> file_names;for (const auto& entry : fs::directory_iterator(dir_path)) {const auto& path = entry.path();if (path.extension() == ext) {file_names.push_back(path.filename().string());}}return file_names;
}double extract_timestamp(const std::string& file_name) {std::string timestamp_str = file_name.substr(0, file_name.find_last_of("."));return std::stod(timestamp_str);
}std::string find_closest_jpg(const std::string& pcd_file, const std::string& jpg_dir) {std::vector<std::string> jpg_files = get_file_names(jpg_dir, ".jpg");double pcd_timestamp = extract_timestamp(pcd_file);std::string closest_jpg;double min_diff = std::numeric_limits<double>::max();for (const auto& jpg_file : jpg_files) {double jpg_timestamp = extract_timestamp(jpg_file);double diff = std::abs(pcd_timestamp - jpg_timestamp);if (diff < min_diff) {min_diff = diff;closest_jpg = jpg_file;}}return closest_jpg;
}void align_timestamps(const std::string& pcd_dir, const std::vector<std::string>& jpg_dirs, const std::vector<std::string>& output_dirs) {std::vector<std::string> pcd_files = get_file_names(pcd_dir, ".pcd");for (const auto& pcd_file : pcd_files) {for (int i = 0; i < jpg_dirs.size(); ++i) {std::string closest_jpg = find_closest_jpg(pcd_file, jpg_dirs[i]);std::string output_file = output_dirs[i] + "/" + closest_jpg;if (!fs::exists(output_file)) {fs::copy(jpg_dirs[i] + "/" + closest_jpg, output_file);}}}
}int main() {std::string dataset = "02-CQU 05";std::string pcd_dir = "E:\\UGV_Data_CQU\\" + dataset + "\\rslidar_points";std::vector<std::string> jpg_dirs = {"E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam1","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam2","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam3","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam4","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam5"};std::vector<std::string> output_dirs = {"E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam_time_alig1","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam_time_alig2","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam_time_alig3","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam_time_alig4","E:\\UGV_Data_CQU\\" + dataset + "\\usb_cam_time_alig5"};//    std::string pcd_dir = "E:\\UGV_Data_CQU\\07-CQU 07\\rslidar_points";
//    std::vector<std::string> jpg_dirs = {
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam1",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam2",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam3",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam4",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam5"
//    };
//    std::vector<std::string> output_dirs = {
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam_time_alig1",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam_time_alig2",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam_time_alig3",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam_time_alig4",
//            "E:\\UGV_Data_CQU\\07-CQU 07\\usb_cam_time_alig5"
//    };align_timestamps(pcd_dir, jpg_dirs, output_dirs);return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(time_align)set(CMAKE_CXX_STANDARD 17)add_executable(time_align time_align.cpp)target_link_libraries(time_align stdc++fs)

这段代码的主要作用是对齐不同传感器采集的数据的时间戳,并将对齐后的图像复制到指定的输出目录。下面是对代码的详细解释:

  1. 代码首先定义了一些命名空间和辅助函数:

    • fs 命名空间是 std::filesystem 的别名,用于文件系统操作。
    • get_file_names 函数用于获取指定目录下指定扩展名的文件名列表。
    • extract_timestamp 函数用于从文件名中提取时间戳。
    • find_closest_jpg 函数用于在给定的 jpg 目录中找到与指定 pcd 文件时间戳最接近的 jpg 文件。
  2. align_timestamps 函数是代码的核心部分,它接受三个参数:

    • pcd_dir: pcd 文件所在的目录路径。
    • jpg_dirs: 一个字符串向量,包含多个 jpg 文件所在的目录路径。
    • output_dirs: 一个字符串向量,包含对应的输出目录路径,用于存储对齐后的 jpg 文件。

    函数的主要步骤如下:

    • 获取 pcd 目录下的所有 pcd 文件名列表。
    • 对于每个 pcd 文件,执行以下操作:
      • 对于每个 jpg 目录,找到与当前 pcd 文件时间戳最接近的 jpg 文件。
      • 将找到的 jpg 文件复制到对应的输出目录,如果输出目录中已经存在同名文件,则跳过复制。
  3. main 函数是程序的入口点,它定义了所需的目录路径和输出目录路径,并调用 align_timestamps 函数进行时间戳对齐和文件复制操作。

    • pcd_dir 变量指定了 pcd 文件所在的目录路径。
    • jpg_dirs 向量包含了多个 jpg 文件所在的目录路径。
    • output_dirs 向量包含了对应的输出目录路径,用于存储对齐后的 jpg 文件。

总结起来,这段代码的主要功能是:

  1. 读取指定目录下的 pcd 文件和 jpg 文件。
  2. 对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。
  3. 将找到的 jpg 文件复制到对应的输出目录,实现时间戳对齐。

这种时间戳对齐的操作在多传感器数据融合中非常常见,它确保了不同传感器采集的数据在时间上是同步的,方便后续的数据处理和分析。

代码中使用了 C++17 的文件系统库 std::filesystem,简化了文件和目录的操作。同时,代码使用了 C++ 的标准库函数和数据结构,如 std::vectorstd::stringstd::numeric_limits,提高了代码的可读性和可维护性。

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

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

相关文章

『VUE』27. 透传属性与inheritAttrs(详细图文注释)

目录 什么是透传属性&#xff08;Forwarding Attributes&#xff09;使用条件唯一根节点禁用透传属性继承总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 什么是透传属性&#xff08;Forwarding Attributes&#xff09; 在 V…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…

AdaBoost 二分类问题

代码功能 生成数据集&#xff1a; 使用 make_classification 创建一个模拟分类问题的数据集。 数据集包含 10 个特征&#xff0c;其中 5 个是有用特征&#xff0c;2 个是冗余特征。 数据集划分&#xff1a; 将数据分为训练集&#xff08;70%&#xff09;和测试集&#xff08;3…

maven的optional选项说明以及具体应用

写在前面 本文看下maven的optional选项的作用和用法。 1&#xff1a;什么作用 考虑这样的场景&#xff0c;A依赖B&#xff0c;B依赖C&#xff0c;正常的按照依赖的传递性&#xff0c;A也会间接的依赖C&#xff0c;但是在一些特定的场景中项目A只希望依赖B&#xff0c;而不依…

QSS 设置bug

问题描述&#xff1a; 在QWidget上add 一个QLabel&#xff0c;但是死活不生效 原因&#xff1a; c 主程序如下&#xff1a; QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…

论文阅读 - Causally Regularized Learning with Agnostic Data Selection

代码链接&#xff1a; GitHub - HMTTT/CRLR: CRLR尝试实现 https://arxiv.org/pdf/1708.06656v2 目录 摘要 INTRODUCTION 2 RELATED WORK 3 CAUSALLY REGULARIZED LOGISTIC REGRESSION 3.1 Problem Formulation 3.2 Confounder Balancing 3.3 Causally Regularized Lo…

JVM双亲委派与自定义类加载器

一. 类加载过程 Java Application运行前需要将编译生成的字节码文件加载到JVM中&#xff0c;JVM类加载过程如下&#xff1a; 1. 加载 加载阶段是类加载的第一步&#xff0c;在加载阶段JVM会查找并加载类的字节码文件&#xff0c;这个过程通常从类路径&#xff08;Classpath…

Android Osmdroid + 天地图 (二)

Osmdroid 天地图 &#xff08;二&#xff09; 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图…

R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38273 多模态数据在统计学中并不罕见&#xff0c;常出现在观测数据来自两个或多个潜在群体或总体的情况。混合模型常用于分析这类数据&#xff0c;它利用不同的组件来对数据中的不同群体或总体进行建模。本质上&#xff0c;混合模型是…

AI开发-计算机视觉库-OpenCV

1 需求 官网&#xff1a;OpenCV - Open Computer Vision Library 2 接口 3 示例 import cv2image cv2.imread("./data/train/1_1.jpg") print(type(image)) 4 参考资料

RK3588 C++ 多线程运行

RK3588 C 多线程 实际运行解决OpenCV问题&#xff1a; 1. OpenCV 安装 sudo apt-get update sudo apt-get install libopencv-dev2. 检查 OpenCV 安装路径 find / -name OpenCVConfig.cmake3. 设置 OpenCV_DIR 环境变量 export OpenCV_DIR/usr/lib/aarch64-linux-gnu/cmake/op…

从0开始学习机器学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图&#xff0c;可以看到两者的区别在于无监督学习的样本是没有标签的&#xff0c;换言之就是无监督学习不会赋予主观上的判断&#xff0c;需要算法自己去探寻区别&#xff0c;第二张…

git使用及上线流程(仅为我工作中常用)

推荐软件或者直接终端 ⚠️注意&#xff1a;在确保远程和本地分支都可使用的情况下 git常见使用命令 ls---查看所有目录 pwd---本机密码 cd 目录名---进入目录 Touch ---创建文本文件 git status---查看状态 git branch---查看分支 git pull---拉取远程最新代码 git checkou…

shell编程之变量与引用

目录 深入认识变量什么是变量变量的名称变量数据类型变量的定义自定义变量环境变量位置变量 变量赋值和作用域赋值&#xff1a;变量名变量值read从键盘读入变量值变量和引号变量的作用域变量的运算 深入认识变量 什么是变量 变量是在程序中保存用户数据的一段内存存储空间&am…

精华帖分享|浅谈金融时间序列分析与股价随机游走

本文来源于量化小论坛公共讨论区板块精华帖&#xff0c;作者为正扬&#xff0c;发布于2024年6月3日。 以下为精华帖正文&#xff1a; 01 引 时间序列分析是个很唬人的术语&#xff0c;实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点&#xff0c;又看到互联…

计算机网络 (4)计算机网络体系结构

前言 计算机网络体系结构是指计算机网络层次结构模型&#xff0c;它是各层的协议以及层次之间的端口的集合。这一体系结构为计算机网络及其部件应完成的功能提供了精确定义&#xff0c;并规定了这些功能应由何种硬件或软件来实现。 一、主流模型 计算机网络体系结构存在多种模型…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

Elastic Agent:可灵活地在任何地方发送和处理任何数据

作者&#xff1a;来自 Elastic Nima Rezainia Elastic Agent 是一款功能强大且用途广泛的工具&#xff0c;可用于从各种数据源&#xff08;包括自定义用户应用程序&#xff09;收集日志和指标。现在&#xff0c;Elastic Agent 提供了无与伦比的灵活性&#xff0c;可以将数据准确…

Android CCodec Codec2 (二一)InputBuffers

CCodec使用CCodecBuffers来对输入/输出端口上的buffer进行管理&#xff0c;这一篇文章我们将一起了解InputBuffers&#xff0c;也就是输入端口的buffer管理方法。 1、CCodecBuffers CCodecBuffers是端口管理的基类&#xff0c;它抽象了输入端口管理和输出端口管理的通用方法&a…

JDBC-Mysql 时区问题详解

目录 一、前置准备 1.1 版本号列表 1.2 Sql脚本 1.3 application.yaml配置 1.4 数据库时区设置 二、java Date类型与&#xff08;jdbcType&#xff09;TIMESTAMP类型的转换 2.1 jdbc对serverTimeZone的处理 2.2 java Date转&#xff08;jdbcType&#xff09;TIMESTAMP …