|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.问题描述9 C" n6 r" w) `4 ?9 ?
1 o& M/ C) L: h6 ]) c7 ^$ Q; j- ~7 x0 R最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。9 s8 [6 p0 }% A+ \/ s% l% U
3 a4 C5 a# i' e7 i7 m5 P# N/ y% g0 F
2 F/ r% k+ g! x$ }
2.解决办法3 V% l1 r% M" Y; @' s
2 t" {/ i2 A! p% E! `; h8 T一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。! g" W6 c0 U3 f# \1 ~! X
3 ?4 V+ O8 n( A2 F# Q" y接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:6 c. h7 V' |2 h" l* R& @
$ y% r+ F- j( W/ g2.1 matio库的安装$ I, i9 J5 ~' x( a0 z1 j, m$ A
* x X$ }' k2 V. s( N3 {# p+ ?! O
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
; `# H* U: a1 }3 l6 f; l# a( p/ m) O
sudo apt-get install libmatio-dev
3 D2 H& Q) ~, D2 v( ~; V5 p9 p
" x) \+ H& r; M1 @) j
1 \0 [% I9 r, m- S2.2 matio库的使用, ^5 @1 f- X2 s" E7 E
+ a$ v) a# S% x u- a4 F! g下面可以写一个测试的小程序,首先构建测试文件目录6 j0 B' y. A% j/ k: e
& v. j: Q* B! b5 J' c1 Q V# t
mkdir test_matio" P+ u% O$ A' U6 ?/ L3 t
cd test_matio
: _; b# }- T! Htouch test.cpp
) d3 Q5 v- i5 C" s& u* ztouch CMakeLists.txt
/ o& ~$ q6 Y" v% _# y" Z% M1 ~, n$ G2 ~) Y. U/ C& S6 t
, w; @$ @) F; W. r( M7 V& W
因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:5 y( a0 V: N. L# Y4 v" F) s
0 z U8 n0 L. f4 c; r#include <string>/ R: o$ x* \4 x! Z7 E6 M. L
#include <iostream>
/ F& N- u- ?' ?- I& r" C/ P7 `/ U/ q9 H" l! l
#include "matio.h"
( {; ^5 z2 i4 Y/ j3 J
" X c. n! G: f- v6 ^#include <opencv2/core/core.hpp>
1 u0 Y7 D \' R( X3 n
E& }* O5 x* D0 `& G, j, ?- \: b( E& e: l
using namespace std; }; F v1 c1 W U' F" i% o
using namespace cv;
+ R' x' y4 W9 h! }) f
, m7 W$ k, |) V* d* j, m! nint main()0 L& e6 d- d4 h2 I+ _
{
( M. T: s6 q0 c! o Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);
* Y% P9 W( H& D; a4 T8 L# D Mat test_vec = test.reshape(1,1);
/ a9 p$ p7 P7 ^' V
: Z0 a7 u# |' K, J$ k5 t* |" l size_t dims[2] = {1,6};
! V( d* `* j8 O5 e
2 }/ X, z& l5 j3 }; a mat_t * mat;2 B: n& M" [1 `& j2 l; w+ a
matvar_t * matvar;" e+ L- p x3 d( |& S+ V6 B o
! y# x/ c- J6 }2 D% a n( y
mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);' ?& ^7 ?% l! e5 q, ]4 Y4 r9 s. @
if(mat)
* I: F1 {9 ~- ^( L1 I# T {
) ]/ a) m9 I, d: D+ u2 K( i matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);2 b; g& G3 F" m# T2 o/ n8 u
Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
9 ]/ \& z$ v3 E. ~ Mat_VaRFree(matvar);, K7 ~: W9 S0 z6 ?3 Z; L
Mat_Close(mat);+ x9 N/ R0 n* w, A1 }$ E2 x a
}
* ^6 ]8 }3 @9 ? s else/ f0 X& v- C. B2 r
{
6 p+ c; \9 E' ?7 F' x3 E2 | cout << "cannot open the mat file to write" << endl;
! w4 N. S2 w* n4 K) ? getchar();- n; F- O0 i, q5 H
}
4 ]; k! ~. ]( Q1 t Q2 Q' o1 @. u- ^- g: ?1 K
return 0;
( X) t4 v9 t: s4 Q}! H. J3 [9 G, V, W3 K9 f' H6 D5 D
+ @4 r1 ~+ g0 s3 F" N) x( G: ~" r7 J' R" X; a, _2 R
这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。 ) Y6 A' n3 \; L! E. s
下面写CMakeLists
( x4 D1 k) d5 t6 e: F7 Z. Z' P6 J
' ^8 y2 f+ t. k. O) Xcmake_minimum_required(VERSION 2.8)
4 M2 f3 A& }. _8 ^: Z* ^project(test_matio)
5 p1 L& j1 B( V* D: @. G' }/ t% H9 i& Y( }' I
find_package(OpenCV REQUIRED), w# g4 @0 k. K+ }
7 r2 x7 R4 H* P4 b2 oset(SRC_LIST test.cpp)
9 U2 s. [9 _3 n
; h' s% s% j$ o5 t3 K9 D0 ]6 t2 Linclude_directories(${OpenCV_INCLUDE_DIRS}): {" D# X: A. a. y: v
- b0 t3 L* t% {2 Q1 u9 a3 n* ?( f/ Gadd_executable(test_matio ${SRC_LIST})9 ~# P1 b' k4 l6 O
& h7 H v- ]% k% I! Q" l
target_link_libraries(test_matio ${OpenCV_LIBS} matio)- N+ n3 H6 T! c9 \1 K% o
# j9 u- J+ _! P
r7 v2 ]% z& @; P
终端进入test_matio目录,执行: G% |* w" a$ P& Q0 d
- S1 y0 P. h3 ^; E$ L5 w
cmake CMakeLists
. W/ f5 [6 P" umake" O/ z3 Z$ B. \/ M8 D# K
./test_matio
) i! j- S5 O7 X. E# i. E6 H
- S& t- ~* I4 t- _1 O, M, @1 L Y
就能在当前目录下得到test.mat
P) \9 F& d0 l, u1 u然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。! j% W; f. T0 p. W3 V
- U! Z" E* }7 K4 J
3 i% r4 K0 p- G0 d- h O0 c9 W+ [
: @& ` ]: b' N0 }
0 _$ U! `" U& c+ x" R& `9 ^9 R |
|