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回来,就可以得到原来的矩阵。
相关文章推荐
- Matlab读取xml文件——OpenCV通过FileStorage存储的矩阵Mat
- openCV,C++接口,cv::Mat矩阵数据元素读取
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
- java 和 c++ 之间通过 控制台 输入输出 传递数据
- opencv和matlab矩阵类型数据相互传递
- OpenCV和Matlab 通过XML传递数据
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
- OpenCV和Matlab 通过XML传递数据
- 将Opencv java中的Mat通过jni传递到C++中的方法
- 将matlab的数据保存xml 在c++下通过opencv读取;
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
- matlab 控件之间通过GUI Data传递数据
- jsp 通过 Ajax 和servlet之间的连接及数据传递示例
- Java与C\C++之间通过JNI传递中文字符串
- winXP系统通过蓝牙在笔记本和手机之间传递数据
- opencv中的矩阵解释,包括CvMat IplImage 、MAT 类型之间的转化
- 定义一个不受计算机字长限制的整数类INT,要求INT与INT以及INT与C++基本数据类型int之间能进行+、-、×、÷和=运算,并且能通过cout输出INT类型的值。(持续添加)
- 利用 WM_COPYDATA 消息 在 C# 和 传统C++应用之间传递数据时,64位平台的问题
- 将C++里的Mat矩阵保存并由matlab提取分析