这段代码的主要功能是:
- 读取指定目录下的 pcd 文件和 jpg 文件。
- 对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。
- 将找到的 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)
这段代码的主要作用是对齐不同传感器采集的数据的时间戳,并将对齐后的图像复制到指定的输出目录。下面是对代码的详细解释:
代码首先定义了一些命名空间和辅助函数:
fs
命名空间是std::filesystem
的别名,用于文件系统操作。get_file_names
函数用于获取指定目录下指定扩展名的文件名列表。extract_timestamp
函数用于从文件名中提取时间戳。find_closest_jpg
函数用于在给定的 jpg 目录中找到与指定 pcd 文件时间戳最接近的 jpg 文件。
align_timestamps
函数是代码的核心部分,它接受三个参数:
pcd_dir
: pcd 文件所在的目录路径。jpg_dirs
: 一个字符串向量,包含多个 jpg 文件所在的目录路径。output_dirs
: 一个字符串向量,包含对应的输出目录路径,用于存储对齐后的 jpg 文件。函数的主要步骤如下:
- 获取 pcd 目录下的所有 pcd 文件名列表。
- 对于每个 pcd 文件,执行以下操作:
- 对于每个 jpg 目录,找到与当前 pcd 文件时间戳最接近的 jpg 文件。
- 将找到的 jpg 文件复制到对应的输出目录,如果输出目录中已经存在同名文件,则跳过复制。
main
函数是程序的入口点,它定义了所需的目录路径和输出目录路径,并调用align_timestamps
函数进行时间戳对齐和文件复制操作。
pcd_dir
变量指定了 pcd 文件所在的目录路径。jpg_dirs
向量包含了多个 jpg 文件所在的目录路径。output_dirs
向量包含了对应的输出目录路径,用于存储对齐后的 jpg 文件。总结起来,这段代码的主要功能是:
- 读取指定目录下的 pcd 文件和 jpg 文件。
- 对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。
- 将找到的 jpg 文件复制到对应的输出目录,实现时间戳对齐。
这种时间戳对齐的操作在多传感器数据融合中非常常见,它确保了不同传感器采集的数据在时间上是同步的,方便后续的数据处理和分析。
代码中使用了 C++17 的文件系统库
std::filesystem
,简化了文件和目录的操作。同时,代码使用了 C++ 的标准库函数和数据结构,如std::vector
、std::string
和std::numeric_limits
,提高了代码的可读性和可维护性。