c++如何解析OpenCV生成的FileStorage XML格式数据【实战】

老敏小哥_3999

老敏小哥_3999

2026-04-13

971人浏览

原创

OpenCV的FileStorage XML是带特定schema的非标准格式,以为根,含type_id、dt编码和空格分隔data;必须用OpenCV FileStorage读取,不可手动解析。

c++如何解析opencv生成的filestorage xml格式数据【实战】

FileStorage XML 文件结构长什么样?

OpenCV 的 FileStorage 生成的 XML 不是标准 DOM XML,而是带 OpenCV 特定 schema 的序列化格式,例如:

<opencv_storage><my_matrix type_id="opencv-matrix"><rows>2</rows><cols>3</cols><dt>f</dt>
  <data>1.0 2.0 3.0 4.0 5.0 6.0</data></my_matrix></opencv_storage>

注意 type_id、dt(数据类型编码)、data 内容空格分隔——这些不是通用 XML 规则,而是 OpenCV 自己约定的。直接用 tinyxml2 或 pugixml 解析后还得手动映射类型和维度,容易出错。

为什么不能直接用 std::ifstream + 字符串解析?

因为 FileStorage 的 XML 是“扁平化”序列化:矩阵、向量、嵌套 FileNode 都可能混在同级节点下,且 data 块里数值不换行、无类型标记。比如:dt 值为 f 表示 float,i 表示 int,3f 表示 Vec3f——这些必须查 OpenCV 源码或文档才能对应。手写解析器极易漏掉 type_id="opencv-nd-array" 这类变体,或把 <size></size> 当普通字段处理。

最稳的解法:复用 OpenCV 自己的 FileStorage 读取

别绕开 OpenCV,它已提供完整反序列化能力。关键点是:用 FileStorage 以 READ 模式打开 XML,再用 operator[] 和 node() 导航,最后用 read() 或模板重载提取值:

  • 确保 XML 文件路径正确,且编码为 UTF-8(Windows 下若用记事本保存过,可能含 BOM,导致 isOpened() 返回 false)
  • 读取矩阵时,优先用 node["my_matrix"] >> mat,而非先 node["my_matrix"].read(mat)——前者会自动处理 type_id 和 dt
  • 读取标量需明确类型,例如 double val; node["thresh"] >> val;;若存的是 int 但读 double,OpenCV 会隐式转换,但精度可能丢失
  • 嵌套结构如 <roi><x>10</x><y>20</y></roi>,用 FileNode roi = node["roi"]; 后再取 roi["x"],不要试图用 XPath

常见报错与绕过技巧

FileStorage::isOpened() == false:多数因文件路径含中文或空格未加引号(Linux/macOS 下 shell 展开问题),或权限不足;建议用绝对路径 + std::filesystem::exists() 预检。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

cv::Exception at ... what(): OpenCV(4.8.0) ... error: (-215:Assertion failed) !_reader.empty() in function 'read':说明节点不存在或名字拼错,检查 node.empty() 再操作,例如:

cv::FileNode n = fs["missing_key"];
if (!n.empty()) n >> value;

读取 std::vector<:point2f></:point2f> 失败:XML 中必须是 <points>1.0 2.0 3.0 4.0</points> 形式(偶数个 float),且节点名要匹配;OpenCV 不支持 <point><x>1</x><y>2</y></point> 这种结构化写法。

真正麻烦的不是语法,而是 OpenCV 对 XML 的“半封闭”设计:它不公开 dt 到 C++ 类型的完整映射表,也不保证跨版本兼容。如果必须脱离 OpenCV 解析(比如嵌入式无 OpenCV 环境),得硬啃 modules/core/src/persistence_xml.cpp 里的 readScalar 和 readMat 实现逻辑——这事真干过的人,基本都回去了。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3131

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

554

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

542

19

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

2024.04.28

6907

8

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

804

4

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

4744

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

6137

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2522

7

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1009

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习