You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV FileStorage读取XML文件报错:Input file is invalid

解决OpenCV FileStorage读取XML时的"Input file is invalid"错误

你遇到的错误源于当前XML文件格式不符合OpenCV FileStorage的解析规范。FileStorage对XML/YAML的结构有特定要求,不能直接将纯文本字符串列表作为节点内容。

原错误代码

#include <opencv2/opencv.hpp>

int main(int argc, const char * argv[]) {    
  cv::FileStorage fs("/Users/thewoz/Desktop/01.xml", cv::FileStorage::READ);  
  return 0;  
}

原错误信息

persistence.cpp:706: error: (-5:Bad argument) Input file is invalid in function 'open'

修正方案

1. 调整XML文件格式

FileStorage要求XML必须包含根节点<opencv_storage>,且序列数据需要用<elem>标签逐个包裹,或者用数组格式组织:

<?xml version="1.0"?>
<opencv_storage>
<images>
  <elem>"20170720_024951.jpg"</elem>
  <elem>"20170720_025001.jpg"</elem>
  <elem>"20170720_025014.jpg"</elem>
  <elem>"20170720_025023.jpg"</elem>
  <elem>"20170720_025034.jpg"</elem>
  <elem>"20170720_025048.jpg"</elem>
  <elem>"20170720_025103.jpg"</elem>
  <elem>"20170720_025115.jpg"</elem>
  <elem>"20170720_025124.jpg"</elem>
  <elem>"20170720_025133.jpg"</elem>
  <elem>"20170720_025147.jpg"</elem>
  <elem>"20170720_025155.jpg"</elem>
  <elem>"20170720_025211.jpg"</elem>
</images>
</opencv_storage>

也可以使用更简洁的数组格式:

<?xml version="1.0"?>
<opencv_storage>
<images>["20170720_024951.jpg", "20170720_025001.jpg", "20170720_025014.jpg", "20170720_025023.jpg", "20170720_025034.jpg", "20170720_025048.jpg", "20170720_025103.jpg", "20170720_025115.jpg", "20170720_025124.jpg", "20170720_025133.jpg", "20170720_025147.jpg", "20170720_025155.jpg", "20170720_025211.jpg"]</images>
</opencv_storage>

2. 修正读取代码

添加文件打开检查,并使用对应的数据结构接收序列内容:

#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
#include <iostream>

int main(int argc, const char * argv[]) {    
  cv::FileStorage fs("/Users/thewoz/Desktop/01.xml", cv::FileStorage::READ);  
  if (!fs.isOpened()) {
      std::cerr << "文件打开失败!" << std::endl;
      return -1;
  }
  
  std::vector<std::string> imagePaths;
  fs["images"] >> imagePaths;
  
  // 验证读取结果
  for (const auto& path : imagePaths) {
      std::cout << path << std::endl;
  }
  
  fs.release();
  return 0;  
}

关键注意点

  • 必须包含根节点<opencv_storage>,这是FileStorage解析的必要条件
  • 序列数据需用<elem>标签或数组格式组织,不能直接放置纯文本
  • 读取时要匹配对应的数据结构(如std::vector<std::string>)来接收数据

内容的提问来源于stack exchange,提问作者thewoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:20