您的位置:首页 > 编程语言 > MATLAB

matlab 的.mat文件 转化为 opencv可读的.yml文件

2016-10-03 16:42 260 查看

关于yml文件

yml官网

opencv的yml手册

opencv可读入.yml文件格式探索

opencv中 利用
FileStorage
类来进行.yml文件的储存与读取

这里可以参见网上诸多博客 OpenCV FileStorage类读写XML/YML文件

另外如何访问三通道图里某个点的某个通道的像素

另外 像RGB格式这样的图片的Mat 每个单元中有三个值,在yml中均以一维形式按顺序储存。

如以下代码保存Mat类到.yml文件

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
#include <time.h>
using namespace cv;
using namespace std;
int main()
{
FileStorage fs("test.yml", FileStorage::WRITE);
fs << "frameCount" << 5;
time_t rawtime; time(&rawtime);
Mat m_CV_32F(3, 3, CV_32F);
Mat m_CV_32FC1(3, 3, CV_32FC1);
Mat m_CV_32FC2(3, 3, CV_32FC2);
Mat m_CV_32FC3(3, 3, CV_32FC3);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Vec3f p;
p[0] = i+(float)i/10;
p[1] = j+(float)j/10;
p[2] = p[0] + p[1];
m_CV_32FC3.at<Vec3f>(i, j) = p;
}
}
Mat m_CV_8UC1(3, 3, CV_8UC1);
Mat m_CV_8UC2(3, 3, CV_8UC2);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Vec2b p;
p[0] = i;
p[1] = j;
m_CV_8UC2.at<Vec2b>(i, j) = p;
}
}
fs << "m_CV_32F" << m_CV_32F;
fs << "m_CV_32FC1" << m_CV_32FC1;
fs << "m_CV_32FC2" << m_CV_32FC2;
fs << "m_CV_32FC3" << m_CV_32FC3;
fs << "m_CV_8UC1" << m_CV_8UC1;
fs << "m_CV_8UC2" << m_CV_8UC2;
}


输出的.yml文件如下

%YAML:1.0
frameCount: 5
m_CV_32F: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ -431602080., -431602080., -431602080., -431602080.,
-431602080., -431602080., -431602080., -431602080., -431602080. ]
m_CV_32FC1: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ -431602080., -431602080., -431602080., -431602080.,
-431602080., -431602080., -431602080., -431602080., -431602080. ]
m_CV_32FC2: !!opencv-matrix
rows: 3
cols: 3
dt: "2f"
data: [ -431602080., -431602080., -431602080., -431602080.,
-431602080., -431602080., -431602080., -431602080., -431602080.,
-431602080., -431602080., -431602080., -431602080., -431602080.,
-431602080., -431602080., -431602080., -431602080. ]
m_CV_32FC3: !!opencv-matrix
rows: 3
cols: 3
dt: "3f"
data: [ 0., 0., 0., 0., 1.10000002e+000, 1.10000002e+000, 0.,
2.20000005e+000, 2.20000005e+000, 1.10000002e+000, 0.,
1.10000002e+000, 1.10000002e+000, 1.10000002e+000,
2.20000005e+000, 1.10000002e+000, 2.20000005e+000,
3.30000019e+000, 2.20000005e+000, 0., 2.20000005e+000,
2.20000005e+000, 1.10000002e+000, 3.30000019e+000,
2.20000005e+000, 2.20000005e+000, 4.40000010e+000 ]
m_CV_8UC1: !!opencv-matrix
rows: 3
cols: 3
dt: u
data: [ 205, 205, 205, 205, 205, 205, 205, 205, 205 ]
m_CV_8UC2: !!opencv-matrix
rows: 3
cols: 3
dt: "2u"
data: [ 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2 ]


容易看到有5个字段:

variable_name: !!opencv-matrix//变量名

//这里要注意的是缩进的问题 一是要保证缩进的合适 二是不能用tab进行缩进

row: 3//行

cols: 3//列

dt: u //这里很重要,如
float
就是
f
,
CV_32FC2
, 就是
“2f”
CV_8UC2
就是
"2u"


data: [0, 0 ] //这里就是以一维形式按顺序储存的

读取.yml文件

FileStorage fs("test.yml", FileStorage::READ);
Mat temp;
fs["m_CV_32FC2"] >> temp;
cout << temp;


MATLAB转化函数 与 struct遍历展开

了解了.yml文件的一般格式 就可以了用matlab写出可供opencv使用的.yml文件了

代码是根据OpenCV 读取 Matlab .mat 文件的方法修改而来

这里注意的是,该函数将matlab中的 struct变量展开了保存。

唯一要注意的就是格式判断与递归展开struct格式。即如何遍历struct 参照Iterating over Matlab struct-Stack

注意,这里各个矩阵中保存的只能是值。

另外mat中矩阵是列优先的 即x=[1 2;3 4]时 x(2) = 2

这里详情可参见关于OpenCV坐标系与MATLAB中矩阵行与列的对应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab opencv