目录
cv::FileStorage()
是 OpenCV 提供的一个用于读写文件的类,主要用于读取和写入结构化数据(如 XML、YAML 或 JSON 文件)。它是用于在文件和内存之间存储和检索复杂数据结构的工具,例如矩阵、向量、标量或自定义的结构化数据。
1. 功能
- 写文件:将结构化数据(如
cv::Mat
矩阵、标量、向量等)保存到 XML、YAML 或 JSON 文件中。 - 读文件:从 XML、YAML 或 JSON 文件中加载数据。
2. 方法和用法
-
构造函数:
cv::FileStorage()
:创建一个空的FileStorage
对象。cv::FileStorage(const std::string &filename, int flags)
:根据指定的文件名和标志打开文件。标志可以是cv::FileStorage::READ
(读取模式)或cv::FileStorage::WRITE
(写入模式)。
-
常用标志:
cv::FileStorage::READ
:打开文件进行读取。cv::FileStorage::WRITE
:打开文件进行写入。cv::FileStorage::APPEND
:追加模式。cv::FileStorage::MEMORY
:用于将文件存储到内存中。
-
读写数据:
-
写入:
- 使用
<<
运算符将数据写入文件。 - 格式为
fs << "name" << value;
,其中"name"
是数据的标签,value
是要写入的数据。 - 可以写入的类型包括标量、向量、
cv::Mat
、结构体等。
- 使用
-
读取:
- 使用
>>
运算符读取数据。 - 格式为
fs["name"] >> value;
,其中"name"
是数据的标签,value
是存储读取数据的变量。
- 使用
-
-
打开和释放文件:
fs.open(const std::string &filename, int flags)
:用于打开文件。与构造函数类似,根据标志指定是读还是写。fs.release()
:关闭文件。
-
文件节点访问:
- 文件存储的数据以树形结构组织,使用
cv::FileNode
类来访问这些节点。 - 可以通过
fs["name"]
的方式访问节点,然后使用>>
运算符读取数据。
- 文件存储的数据以树形结构组织,使用
-
检查文件状态:
isOpened()
:检查文件是否成功打开。release()
:关闭当前打开的文件。
3. 示例
3.1 写入数据
cv::FileStorage fs("output.yml", cv::FileStorage::WRITE);
// 写入标量
int age = 25;
fs << "Age" << age;
// 写入矩阵
cv::Mat mat = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
fs << "Matrix" << mat;
fs.release(); // 关闭文件
3.2 读取数据
cv::FileStorage fs("output.yml", cv::FileStorage::READ);
int age;
cv::Mat mat;
fs["Age"] >> age;
fs["Matrix"] >> mat;
fs.release(); // 关闭文件
4. 常见数据格式
-
XML:
<?xml version="1.0"?> <opencv_storage> <Age>25</Age> <Matrix type_id="opencv-matrix"> <rows>3</rows> <cols>3</cols> <dt>i</dt> <data> 1 2 3 4 5 6 7 8 9 </data></Matrix> </opencv_storage>
-
YAML:
%YAML:1.0 Age: 25 Matrix: !!opencv-matrix rows: 3 cols: 3 dt: i data: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
-
JSON:
{ "Age": 25, "Matrix": { "rows": 3, "cols": 3, "dt": "i", "data": [1, 2, 3, 4, 5, 6, 7, 8, 9] } }
5. 注意事项
cv::FileStorage
适用于存储较大的结构化数据,例如配置文件、模型参数等。- 数据的标签(
name
)必须唯一,读取时依赖于该标签来检索数据。 - 文件的格式可以由文件扩展名(
.xml
、.yml
、.json
)自动检测,也可以手动指定。
6. 总结
cv::FileStorage()
是 OpenCV 中非常强大而灵活的工具,能够有效地处理复杂的结构化数据,使读写文件更加方便。它适用于需要持久化存储 OpenCV 数据的场景,如保存和加载训练模型、图像数据以及应用程序的配置文件。
标签:文件,fs,FileStorage,写入,OpenCV,数据,cv From: https://www.cnblogs.com/keye/p/18376045