OpenCV: 矩阵等对象的文件存取方式

OpenCV: 矩阵等对象的文件存取方式

问题描述

在做图像处理等工作时,经常需要对矩阵Mat等各类对象进行存取,那么在OpenCV中有没有合适的方法呢?

解决方案

存取方法

OpenCV中保存图片的最常用方式是imwrite(),且只能将矩阵按8位/24位图片格式保存。更通用地,保存矩阵数据,要使用FileStorage类,将矩阵保存为XML/YAML文件。示例如下:

Mat I;
/* Process of Mat I
...*/
FileStorage fs("test.xml", FileStorage::WRITE);
// "data" is the label name of (I) in test.xml
write(fs, "data", I);
fs.release();

读取时,

Mat I;
FileStorage fs("test.xml", FileStorage::READ);
read(fs["data"], I);
fs.release();

其中,“data”是由程序员自定义的标签名。

除了使用read()和write()函数进行读取之外,也可以使用流的形式:

fs << "data" << I; 
// 等价于 write(fs,"data",I);
fs["data"] >> I;
// 等价于 read(fs["data"], I);

不过我还是推荐大家尽可能地使用write()和read(),OpenCV针对很多类都重载了对应函数。

在更复杂的情形下,比如我们需要同时保存局部特征向量及其关键点坐标,这里我为了调用的方便,写了如下两个函数:

void FileWrite(const vector &keyPoint, const Mat &src, const string &filename){
    FileStorage fs(filename, FileStorage::WRITE);
    write(fs, "KeyPoint", keyPoint);
    write(fs, "Mat", src);
    fs.release();
}
void FileRead(vector &keyPoint, Mat &dst, const string &filename){
    FileStorage fs(filename, FileStorage::READ);
    read(fs["KeyPoint"], keyPoint);
    read(fs["Mat"], dst);
    fs.release();
}

文件内容

说完了方法,那么保存后的XML文件是怎样的格式呢,我们来瞧一瞧:
OpenCV: 矩阵等对象的文件存取方式_第1张图片
这里笔者折叠了KeyPoint标签和Mat下的data标签(看看行数就懂了),可以看到最外层是opencv_storage,里面是用write()函数保存的两个对象,其中Mat还标出了行数、列数和基本数据类型。

你可能感兴趣的:(OpenCV,C++,opencv,矩阵,保存,读取,xml)