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

7 篇文章 2 订阅

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> &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> &keyPoint, Mat &dst, const string &filename){
    FileStorage fs(filename, FileStorage::READ);
    read(fs["KeyPoint"], keyPoint);
    read(fs["Mat"], dst);
    fs.release();
}

文件内容

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值