|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.问题描述3 E! g. F. f# h7 I& N- G
a& t L9 \( X" g: G$ m( c最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。% o }9 A) ]8 g
0 Q! \- P6 I# Q1 C' \
. g. S5 d |( S/ ~% v" Y2.解决办法
/ Q9 Z- V8 E/ T( u) y3 K
. Q: k% Z6 ~0 K7 S, c3 I一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
. c5 \' p5 g( H" S# {! |
2 t, [8 D% R* E接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:2 U& j% T1 M$ Q
) |( u6 s: Z6 {# M$ r! N" L
2.1 matio库的安装
# u# z& b6 t1 H9 W
% d! r0 G* K5 K* Y! y# b6 O# rmatio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
4 f$ Y6 t" z; y4 w c+ x/ X8 b& {% w
sudo apt-get install libmatio-dev
; G% U/ [. X6 g3 l6 h: e: `4 R/ g, K; e" A3 Y0 U/ w
# A0 A0 v- X5 K; M# g
2.2 matio库的使用: J9 W. t7 p j. U4 F; a
1 |% q0 ]* k& \下面可以写一个测试的小程序,首先构建测试文件目录& c; T0 L, W9 X+ ]. v/ d1 ?2 m( f
) H* @: V+ M7 A/ o' E0 O0 ]# b" r
mkdir test_matio
$ S! Q7 R2 @- K8 q' |cd test_matio [ I2 V1 C# k$ q$ W2 ~1 K
touch test.cpp( p: |. u3 `( ~
touch CMakeLists.txt
7 K& \4 b" [- a: e! Z7 e- {3 J8 Y, [( w# _( Y
$ ^' p. X' f" I$ @ b( P因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
$ q6 j; q7 b% ]3 w4 a, f
% w$ c( L, @ O" q& I! I#include <string>6 U9 A9 c) f6 V" H/ c1 n" @
#include <iostream>
" z( R" A; z! U' a6 q/ j- s
5 m* e4 |, |" t/ s h#include "matio.h"
4 C8 q W: R+ H+ u! A3 H
0 \# |. z3 b4 C3 S: Z#include <opencv2/core/core.hpp>
3 y( o9 U6 }0 O5 h9 E' e2 M5 o, B+ n
5 }/ [/ o+ i/ S. V b% Q/ ^
) J/ F- v, d$ O4 k: v- f/ Eusing namespace std;
( }4 s9 `! U' R' K* V9 R5 K6 husing namespace cv;; P# J- X0 ^$ b U$ Y& l% Q. ~
- t( V$ a- i% I- Q. E, l) ?- ?
int main()$ x& [! i0 L0 f; Z" d( d% T
{; Q! w1 b7 W5 b& L: f3 k7 ]
Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);
+ B. y, m0 C6 x! P. p" f1 a& F0 d Mat test_vec = test.reshape(1,1);8 M2 K; l6 {) [; L3 }# b; I
* W0 ^" D, h- v3 f7 Q size_t dims[2] = {1,6};, C" l l5 R Q1 V+ f2 J
& N. l5 d& q. \) k
mat_t * mat;
9 v) W" F+ Q! K x2 e+ z matvar_t * matvar;
) M9 X3 P, O* C0 J8 ?5 Q
7 C4 @* c) U; G5 n9 b6 n mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);! o/ Z, P7 ~( j& S) b( [" B; ^
if(mat)
# D9 @; W1 ?5 }9 d3 J6 I0 c& T {
' K' t; `% |, f: c. j/ J6 b matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);. Q2 [/ r* }4 b$ k% q
Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);' P. s7 ?7 s3 g: Y @
Mat_VaRFree(matvar); g3 p; g; v+ s& o7 O( r3 F/ `
Mat_Close(mat);3 Q% U# P" }# g# r: x% j1 R
}
( b5 } l/ y! \6 i( O( C else" J( m( U1 l' K
{0 l0 A. X; d( l
cout << "cannot open the mat file to write" << endl;
% }) D0 h' | @' Y, \+ ` getchar();
) R4 g. k' G1 r0 a }
1 T3 t% A, b c% n0 O: ]0 d9 `' S4 F! U( E
return 0;
. C" {4 M+ Q! `6 Y9 i5 f ^9 B}
4 K! {# M- [( w0 Q% b/ B, X# C0 l w3 Z( @5 n; R2 [
' I! u* B; y. U8 n
这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
^7 |! [' y2 L% W, Z& m% B4 p% F下面写CMakeLists7 n: }: n* L3 Q6 p1 R! W, \0 z# ^
" |# z( E! ~& _" K; R4 [, i6 t+ }cmake_minimum_required(VERSION 2.8)
5 U3 z0 T/ M# y7 y tproject(test_matio)2 r, n1 U/ y8 X' \9 M' ?9 A
7 U& ]% _( f' e4 B( L
find_package(OpenCV REQUIRED)
# K( V1 O; K& x& b1 }
* K, z# O$ }. z- j/ iset(SRC_LIST test.cpp)
# M. K7 |# T* {6 Z! q; o8 L# N% ]6 x6 ~3 s
include_directories(${OpenCV_INCLUDE_DIRS})* l1 g6 D( u: i J0 J4 i
V2 d& `( d) B" sadd_executable(test_matio ${SRC_LIST})! g* {# |2 V1 K
* S4 r, [7 O8 f1 L$ B8 o& X/ `
target_link_libraries(test_matio ${OpenCV_LIBS} matio); `' O: n$ e7 T' ^- e
) i; c0 @+ a) ]. H" I2 i+ @ C
! `$ ^4 I; o8 y7 P! m终端进入test_matio目录,执行! ~& Y1 w0 L7 t
u" X" L" c- u
cmake CMakeLists" w7 g2 e# q6 M# p0 m# P
make) ^4 y0 R; c0 V) w9 w
./test_matio
# A6 M6 j& x9 S3 L( ?9 y0 x% r; s& d& B% b3 v& d6 U
: H6 T+ }/ u$ I: L. f
就能在当前目录下得到test.mat 1 d( L0 I4 ^. f2 c! c5 r+ M
然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。
2 v2 f# Z3 w. l: y& c! ^# t; y9 }# H8 l: m
- H% I5 m- R" O, N
) q# O* M3 Q S( I1 Z" D
; K/ [, s5 r! I& K* b* F
6 z0 R; \: r1 h, W S) H' U
|
|