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

Opencv(C++)和matlab之间通过mat传递数据(矩阵)

2017-05-12 09:37 1201 查看

1.问题描述

最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。

2.解决办法

一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。

接下来尝试用matio(https://sourceforge.net/p/matio/)这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:

2.1 matio库的安装

matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入

sudo apt-get install libmatio-dev


2.2 matio库的使用

下面可以写一个测试的小程序,首先构建测试文件目录

mkdir test_matio
cd test_matio
touch test.cpp
touch CMakeLists.txt


因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:

#include <string>
#include <iostream>

#include "matio.h"

#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

int main()
{
Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);
Mat test_vec = test.reshape(1,1);

size_t dims[2] = {1,6};

mat_t * mat;
matvar_t * matvar;

mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
if(mat)
{
matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
Mat_VarFree(matvar);
Mat_Close(mat);
}
else
{
cout << "cannot open the mat file to write" << endl;
getchar();
}

return 0;
}


这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。

下面写CMakeLists

cmake_minimum_required(VERSION 2.8)
project(test_matio)

find_package(OpenCV REQUIRED)

set(SRC_LIST test.cpp)

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(test_matio ${SRC_LIST})

target_link_libraries(test_matio ${OpenCV_LIBS} matio)


终端进入test_matio目录,执行

cmake CMakeLists
make
./test_matio


就能在当前目录下得到test.mat

然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: