#include "utils.h" Utils::Utils() { } Utils::~Utils() { } int Utils::open(const std::string & folder) { this->m_order = 0; this->folder = folder; std::ifstream file(folder + "/list.txt"); if (!file.is_open()) { std::cout << "错误:无法打开文件 " << folder + "list.txt" << std::endl; return 0; } std::string line; int lineCount = 0; int successCount = 0; while (getline(file, line)) { // 跳过空行 if (line.empty()) { continue; } lineCount++; // 按照文件名-经纬高-角度-内参读取到frameInfoList中 FrameInfo frameInfo = {0}; // 解析每行数据:Frame 序号,纬度,经度,绝对高,相对高,偏航,俯仰,横滚,伺服方位,伺服俯仰,焦距,像素大小 int frameId; double lat, lon, height1, height2; double angle1, angle2, angle3, angle4, angle5; float param1, param2; // 使用sscanf解析字符串 if (sscanf(line.c_str(), "Frame %d,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%f,%f", &frameId, &lat, &lon, &height1, &height2, &angle1, &angle2, &angle3, &angle4, &angle5, ¶m1, ¶m2) == 12) { // 解析Frame序号 frameInfo.nFrmID = frameId; // 解析经纬度 frameInfo.craft.stPos.B = lat; // 纬度 frameInfo.craft.stPos.L = lon; // 经度 // 解析高度(取第一个高度值) frameInfo.craft.stPos.H = height1; frameInfo.nEvHeight = height2; // 解析角度信息 frameInfo.craft.stAtt.fRoll = angle3; // 横滚角 frameInfo.craft.stAtt.fPitch = angle2; // 俯仰角 frameInfo.craft.stAtt.fYaw = angle1; // 方位角 // 解析伺服信息 frameInfo.servoInfo.fServoAz = angle4; // 伺服方位角 frameInfo.servoInfo.fServoPt = angle5; // 伺服俯仰角 // 解析内参信息 frameInfo.camInfo.fPixelSize = param2; // 像元尺寸 frameInfo.camInfo.nFocus = param1; // 焦距 // 设置默认值 frameInfo.craft.nPlaneID = 1; frameInfo.camInfo.dCamx = 0; // 像主点偏移x frameInfo.camInfo.dCamy = 0; // 像主点偏移y frameInfo.servoInfo.fServoAzSpeed = 0.0f; // 伺服方位角速度 frameInfo.servoInfo.fServoPtSpeed = 0.0f; // 伺服俯仰角速度 frameInfo.nWidth = 1920; // 默认图像宽度 frameInfo.nHeight = 1080; // 默认图像高度 // 添加到列表中 frameInfoList.push_back(frameInfo); successCount++; } else { std::cout << "警告:第 " << lineCount << " 行解析失败: " << line << std::endl; } } file.close(); std::cout << "读取完成:总共 " << lineCount << " 行,成功解析 " << successCount << " 行" << std::endl; return lineCount; } std::pair Utils::readInfoAndMat() { FrameInfo info = frameInfoList[m_order]; // 读取图片 std::string picPath = folder + "/" + "frame_" + std::to_string(info.nFrmID) + ".jpg"; cv::Mat mat = cv::imread(picPath); m_order++; // 如果读取失败,则返回空 if (mat.empty()) { std::cout << "读取失败:" << picPath << std::endl; return std::make_pair(info, cv::Mat()); } return std::make_pair(info, mat.clone()); }