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

这段代码的主要功能是:

  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.xdnf.cn/news/16639.html

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

相关文章

【数据分享】全国农产品成本收益资料汇编(1953-2024)

数据介绍 一、《全国农产品成本收益资料汇编 2024》收录了我国2023年主要农产品生产成本和收益资料及 2018年以来六年的成本收益简明数据。其中全国性数据均未包括香港、澳门特别行政区和台湾省数据。 二、本汇编共分七个部分,即:第一部分,综合;第二部分,各地区粮食、油料;第…

SQL 处理数列

在关系模型的数据结构中&#xff0c;并没有“顺序”这一概念。因此&#xff0c;基于它实现的关系数据库中的表和视图的行和列也必然没有顺序。 1 处理数列 1.1 实践 1.1.1 生成连续编号 图 t_num 数据库源与目标视图v_seq 需求&#xff1a;根据0~9 这10个数&#xff0c;生成…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

编写情绪K线指标(附带源码下载)

编写需求&#xff1a; 很多交易者抱怨&#xff0c;传统的跟踪类指标常常存在滞后的问题&#xff0c;而预测类指标又常常不够可靠。那么&#xff0c;是否存在一种指标&#xff0c;能够精准地反映当前K线的强弱变化&#xff0c;并且具备高度的时效性呢&#xff1f; 效果展示&am…

16、pxe自动装机

pxe自动装机的组成 pxe&#xff1a;自动安装系统必要的运行环境 无人值守&#xff1a;为系统定制化的安装需要的软件 pxe的优点 规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 自动化&#xff1a;系统安装和服务配置不需要人工干预 远程实现&#x…

H.265流媒体播放器EasyPlayer.js网页直播/点播播放器WebGL: CONTEXT_LOST_WEBGL错误引发的原因

EasyPlayer无插件直播流媒体音视频播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js能够同时支持HTTP、HTTP-FLV、HLS&a…

Javaweb开发核⼼心之玩转Servlet4(笔记)

javaweb开发核⼼心之玩转Servlet4.0 简介&#xff1a;什么是Servlet-开发你的第⼀一个动态⽹网站 什么是Servlet 简介&#xff1a;是JavaServlet的简称&#xff0c;⽤用Java编写的运⾏行行在Web服务器器或应⽤用服务器器上的程序,具有独⽴立于平台和协议的特性, 主要功能在于交…

VUE实现通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

无人机遥控器基础讲解——CKESC电调小课堂08

无人机遥控器是控制无人机飞行的重要设备&#xff0c;以下是对其的详细介绍&#xff1a; CKESC-专业级电调研发生产供应商http://www.ckesc.com 一、外观与布局 1. 通常由两个摇杆、多个功能按钮、一个显示屏和天线组成。 2. 摇杆一般位于遥控器的中央位置&#xff0c;用于控…

谷歌新作:Unbounded开放世界RPG,AI定义无限游戏新纪元

在开放世界和角色扮演游戏的领域里&#xff0c;玩家们总是渴望着那种无拘无束的自由体验。他们梦想着一个没有空气墙阻隔&#xff0c;没有剧情杀限制&#xff0c;没有任何交互限制的游戏世界。现在&#xff0c;这个梦想可能即将成真。谷歌联合北卡罗来纳大学教堂山分校推出的Un…

Qt文件目录操作

文件目录操作相关类 Qt 为文件和目录操作提供了一些类&#xff0c;利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个&#xff1a; QCoreApplication&#xff1a;用于提取应用程序路径&#xff0c;程序名等文件信息&#xff1b;QFile&#x…

网页web无插件播放器EasyPlayer.js H.265流媒体播放器的decoder.js报Unexpected token ‘<‘错误

EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff…

渗透测试之信息收集 DNS主机发现探测方式NetBIOS 协议发现主机 以及相关PorCheck scanline工具的使用哟

目录 主机发现 利用NetBIOS 协议发现主机 利用TCP/UDP发现主机 PorCheck scanline 利用DNS协议发现主机 主机发现 信息收集中的一项重要工作是发现内网中的主机、数据库、IP段网络设备、安全设备等资产&#xff0c;以便于更快地获取更多权限和密码&#xff0c;更加接近红…

Nginx SSL+tomcat,使用request.getScheme() 取到https协议

架构上使用了 Nginx tomcat 集群, 且nginx下配置了SSL,tomcat no SSL,项目使用https和http协议。 发现 request.getScheme() //总是 http&#xff0c;而不是实际的http或https request.isSecure() //总是false&#xff08;因为总是http&#xff09; request.getRemoteAddr(…

[Redis] Redis服务集群

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

期权懂|上证50ETF期权的交易时间是什么时候?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 上证50ETF期权的交易时间是什么时候&#xff1f; 一、开盘集合竞价时间‌&#xff1a; 上午9:15至9:25。在这段时间内&#xff0c;投资者可以提交或撤销委托&#xff0c;但不会立…

FPGA 第7讲 简单组合逻辑译码器

时间&#xff1a;2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程&#xff0c;在编码时&#xff0c;每一种二进制代码&#xff0c;都赋予了特定的含义&#xff0c;即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码&#xff0c;实现译码操…

jmeter常用配置元件介绍总结之断言

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之断言 9.断言9.1.响应断言9.2.JSON断言9.3.大小断言9.4.JSON JMESPath Assertion9.5.断言持续时间9.6.MD5Hex断言9.7.XPath断言9.8.XPath2 Assertion 9.断言 检查测试中得到的响应数据结果是否符合预期 9.1.响应断言 功…

莱特币转型MEME币:背后隐含的加密市场现象

随着加密市场的风云变幻&#xff0c;莱特币&#xff08;LTC&#xff09;这款曾经的“老牌矿币”近日以自嘲式推文宣布“自己是一个MEME币”&#xff0c;迅速引发了市场的广泛关注和一波围绕MEME币的炒作浪潮。这一举动看似玩笑&#xff0c;却反映出当前加密市场的一种微妙转变&…

【网页设计】CSS3 进阶(动画篇)

1. CSS3 2D 转换 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 转换&#xff08;transform&#xff09;你可以简单理解为变形 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xf…