|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.问题描述/ O) w0 c/ g; x0 v0 q2 @+ a% x
2 m M2 n- f% x7 t, A) ^
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。' n3 a' Y3 \9 U
6 B' O' A) p7 ]5 l2 V
7 `; j0 q. I! y/ I2.解决办法
5 w8 [7 k. R6 z, L1 `- {4 ^* K
+ L7 @/ y9 T5 r% Y3 m1 L7 z- A一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
( ?# [4 Y1 n& b% ]
9 m3 o8 x: l- e/ f1 F& [" a接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:7 ^. h9 a6 V3 s, {" n2 `
, S" }& y+ E& Y I( P0 L! d2.1 matio库的安装
% e3 q, g6 k& n7 [0 @! F& m1 f: e6 c& n1 T7 F, Y1 T
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
' _' C5 b* Y$ {' B6 t: _
/ l9 [3 W) U$ W4 J; Hsudo apt-get install libmatio-dev
n: a5 q! Y. }, p* l. b; v
, e' Y \/ S- `2 q
) d4 U' y( E; F: c+ j1 D2.2 matio库的使用
6 D- A' D) q% ~, a0 z1 G/ P( s+ |$ z9 G" s6 f7 ^
下面可以写一个测试的小程序,首先构建测试文件目录+ E, g& J# [7 e1 ]. V) }& F
( \8 U: m* {" A4 c8 Wmkdir test_matio
2 Y1 M1 T. s& _0 j4 s0 G- ^; scd test_matio
7 n* R# L5 [; w, stouch test.cpp
0 X N" x: L3 [$ o" T$ v& E1 Ktouch CMakeLists.txt( p# v7 ]2 ~( H2 z: M( H
6 h% D/ [' S0 V6 Q" d" z" d& N# b% g1 o. O' |
因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
5 O3 u- I: L( o
$ }) x5 n# D) ?* O9 Q7 c* G* O#include <string>- N8 p* H- S3 v. k$ o+ B
#include <iostream>! q6 [8 M, Y* r: J' q% a
2 Y$ \; _3 k9 C( D. d. X$ ]#include "matio.h", V r! i; @, H+ ~4 F$ U, P
* s6 A8 C9 s# {/ N! ^% [8 S0 v3 f#include <opencv2/core/core.hpp>
$ S$ G5 b% R/ g/ k4 i. c4 d" S
; ]% d6 x! p/ J0 X) i" O T* M- v. y, i1 p! X
using namespace std;
) S w& {" Y' @ u1 o# [using namespace cv;
2 B; L" ^( y+ z
8 L! P( a9 R( xint main()) J7 A$ d, j6 S0 K1 d) i: O+ P) q: g
{
& H9 H+ v: F7 p Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);
0 F# v# n. ~2 f Mat test_vec = test.reshape(1,1);
% v$ W/ ]2 @/ f W6 y* S
6 |2 |1 Z* L$ K1 M( u2 \ size_t dims[2] = {1,6};
y6 {' a7 L# f; c# q8 I" O% m% a5 G& u& z4 h9 J4 k5 u* R7 v# C
mat_t * mat;- B5 \' L- m5 l( A- ~8 P3 `- ~* F+ i
matvar_t * matvar;
9 R/ q o6 V7 q$ i! s8 z$ p1 W5 l; l/ G# a0 F; N
mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
* ]+ m# t! B' c2 _ if(mat)- q$ L* c8 \' e" X' D2 Y: W7 ]
{6 j1 Q3 n' m/ _3 s- p% Z
matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
: Z e+ k. \, ] Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
% M5 t8 U" ~' v% A2 o Mat_VaRFree(matvar);" L) O) x s7 f
Mat_Close(mat); N2 G4 g% R: L- j) W
}
% \! ^& p4 ~+ b& y. f4 p' o else: ?$ a; D v3 W
{$ e7 ^6 L( R9 D3 w; ]' b0 ]
cout << "cannot open the mat file to write" << endl;+ ?" F- O# B. T& B Y( K+ l
getchar();
3 J D$ Q$ H% M4 x* A! B( l, s }! z4 b( c8 U2 h. l1 Z2 g5 M
& l* w' I5 H4 b |0 {9 C return 0; @8 d8 C/ ~. a! c: w: i
}
! {. x% P1 q& b
2 a" f2 E* \& u' ^, r, q; ^
( m( ^5 Q) n/ R9 b这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。 7 y+ ^0 Z! X* N8 H) n; ]! l
下面写CMakeLists
6 N$ ~9 m3 ]& v2 I1 G$ \5 [& U
- C' N- J" f5 K4 lcmake_minimum_required(VERSION 2.8)
. v/ Y8 c9 C2 H8 o" tproject(test_matio)
. }- Y/ ]* s! Z8 T3 f0 y% P$ j1 b; }" @
find_package(OpenCV REQUIRED)
. j- U8 ?! [2 d" Q
m. U# h6 w- B6 j; nset(SRC_LIST test.cpp)$ D4 W4 e7 p$ k: D9 Q3 u3 b/ }
$ j+ X% O$ g7 R! C8 x- `include_directories(${OpenCV_INCLUDE_DIRS})
$ c' \0 m. \3 o4 f& H! |4 c: {8 C" H, C5 T# V6 {7 A; }! k( u
add_executable(test_matio ${SRC_LIST})
4 l# o2 }0 Y) r: q$ F+ ~8 l6 t3 a( j7 W
target_link_libraries(test_matio ${OpenCV_LIBS} matio): i' E3 w3 B; h8 f
; l% g! ]& Q# ]: B. R
; m$ J* y: k. I2 f& S' F
终端进入test_matio目录,执行
% @* ]/ Y( ^. |) B8 M4 z
5 k R$ r: ?" {3 R8 x" e4 y4 n6 O- Jcmake CMakeLists3 M2 w0 W8 h: a0 I
make
& D3 V8 U# U& K+ f./test_matio
) _: l- X* D. X5 D1 o8 _4 p1 T8 z) s. j7 j: D2 W
( E9 ? G0 r3 J5 {, b' X
就能在当前目录下得到test.mat 0 z+ I( n7 ]2 x2 g1 a) k" Y7 h
然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。* y! o0 E5 Y7 O3 S) k5 {
' R' }6 Q8 z d/ X4 i
2 e; H2 [; i9 Y0 J+ ~$ Q6 m* p
6 A; r: D d' T" o& l0 Z
6 b8 {2 \0 g: f7 l) ^5 x" [* v6 A/ r7 b- b' f; ~9 E5 g9 U
|
|