使用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
相关产品推荐
相关产品推荐

