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 将.mat文件转化为.txt文件保存
- 【转】如何把Matlab中的m文件转化成C语言代码
- C++版本 yml 文件的读取 based on OpenCV 2.1
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
- OpenCV FileStorage类读写XML/YML文件
- 关于Matlab p文件,asv文件和mat文件
- 如何将MATLAB文件转化为可执行文件
- OpenCV FileStorage类读写XML/YML文件
- MATLAB与图像处理(四):将图片序列转化为视频文件,将视频文件转化为图片
- opencv读取yml文件
- OPenCv采用FileStorage类读写xml或者yml文件----程序
- MATLAB的M文件、MEX文件、MAT文件是什么 .如何打开(直接鼠标拖入相应区域)
- matlab编译含opencv函数cpp文件
- opencv中图像与Matlab中mxArray的转化
- 将txt文件转化为mat文件
- 解决matlab的mat文件与ACCESS2003文件关联冲突问题
- opencv读matlab中.mat文件
- OpenCV FileStorage类读写XML/YML文件
- OpenCV读写yml文件里的Mat变量
- matlab 实践程序2——批量将seq文件转化为avi文件