1. 程式人生 > >Opencv(C++)和matlab之間通過mat傳遞資料(矩陣)

Opencv(C++)和matlab之間通過mat傳遞資料(矩陣)

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回來,就可以得到原來的矩陣。