|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.问题描述
+ E5 A/ s$ m4 n3 l# M
: C$ p( W% g1 y4 x- f1 U6 Z最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。# k( a3 \3 r( {& k/ I( b' f
/ J4 y1 W; L* U3 P6 x
/ ~; ?' h: T5 Z2.解决办法+ J9 o) T: p% S/ l' h( ]* L
- A6 D& U+ d$ k. _4 u" c" |* f一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。# u0 N; _: Q+ L/ D& l; z
$ v; u* r/ }8 a' y, l
接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:
" R" g# n: z8 M8 J* q
% V9 T. \, n' X }9 M8 v8 b+ h. z1 G1 \2.1 matio库的安装
{4 g( t# f ]& u
+ y* t- s- E6 ^; {# y7 m1 Z' j( i! fmatio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
# T& {9 L9 {) ^- ^ w' o
+ |* `) C( G Y! l" _" zsudo apt-get install libmatio-dev+ Y" C% F2 A9 |4 S$ n" Z: q$ p
- z! a0 f8 J: c( o' B
k* V9 {6 Q1 A1 ~/ ~4 y! c2.2 matio库的使用! f' W4 K% D* D& ^
; J5 U! s1 S/ X' }
下面可以写一个测试的小程序,首先构建测试文件目录7 i. |0 z4 ?( Q8 l% h$ _
7 a; p' k! L" `mkdir test_matio
4 U' j) f; C( o7 v5 @3 V4 ucd test_matio
! j$ f) d8 R$ B+ s d7 xtouch test.cpp
( W' d' g2 \/ I3 Ztouch CMakeLists.txt
% c& t' w. K9 U& `! p* ]9 B2 ]6 S' T0 O: r0 O, ~
% [" C0 ~0 z4 X* u9 _1 w$ [" F& h因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
6 j' O' G: q6 C6 e
- N: I @2 h" ^5 T7 a& X#include <string>
1 {$ L; ~2 m) V) g; m+ I#include <iostream>" s3 v. _' J' x
8 ?+ ]2 K3 |3 W2 z5 g* }
#include "matio.h"3 a5 U/ t, E$ ]3 z8 X* {: f' J7 x
9 `3 u1 k8 {! N3 D% o#include <opencv2/core/core.hpp>
! [: P+ N/ c# X5 o5 {
7 `/ o2 Z+ L; ?$ W3 @! x4 }
7 y9 D. j* h* q- G1 M6 |using namespace std;
! v. U% H2 X; u6 L) `( Qusing namespace cv;/ i2 Z; T m4 k4 u
. Y& U2 I& }( L: L9 o8 U/ C" U6 n
int main()+ o$ e8 S0 e: g3 Q; O M B
{
: L2 l R. s9 @+ e. p# S Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);$ R3 r6 q' Q8 a/ D( g
Mat test_vec = test.reshape(1,1);9 H+ K/ x+ ?+ w) s# J6 N( B; C
5 i1 j' |* V3 A& ^ size_t dims[2] = {1,6};8 | K" q7 \6 n1 F
( c7 I$ I/ T6 ^ mat_t * mat; C* h" e1 f. f
matvar_t * matvar;3 Y$ K3 @4 v) i9 b& O; ]- E
/ s( n5 n' P" Q" q5 a( P# h6 Q5 H' V9 J mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
3 a& ]7 O8 i3 L6 e! _ if(mat)
* d5 h5 C; ~$ H8 G2 h {1 [/ _* @$ r) t$ [
matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);/ W& p/ z( Q5 c6 q7 R
Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);% C( C) Q8 T0 ?4 N0 g1 U
Mat_VaRFree(matvar);
! B) R/ t$ o( W# P3 o. O. m Mat_Close(mat);- c o8 f$ P( A" x
}
* i/ @$ k" H3 x+ t& V. l+ O6 e else
8 M+ f8 r. b4 d {/ p- y9 V- t. y- a# g3 a" ~
cout << "cannot open the mat file to write" << endl;
; K5 ]0 d& @- G3 V8 X2 J getchar();5 ^0 E: b) n' Y3 n$ c7 h
}
+ U8 ^( _4 `4 ~! x7 v, p# U) f: C( v. e I/ ~
return 0;
" \; U* `: J5 b" c; j}
+ z* b. H. v6 W ]9 |& r+ k, t6 R& }# ?( i
8 F9 [5 |$ ]8 V6 g4 m- d
这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
$ d# I; i6 h2 N& N% z0 U下面写CMakeLists
( [* `. N& T, ~( j. ?+ X
( d( V+ Z9 U% p3 g! U3 o3 X* d2 L* ^cmake_minimum_required(VERSION 2.8)( p( N; R* v" k, b! _
project(test_matio)
9 @4 g& q7 [, d' y0 |2 d) }5 b$ N! s/ @4 ` `& `' _% a$ X: x3 M3 D% v
find_package(OpenCV REQUIRED)
6 C7 z& I! v0 C& w& W' E
- r2 C' m- i f4 O% p* Kset(SRC_LIST test.cpp)
( p$ ?) \8 A) Z+ o( [" { _' P
8 R! u3 ~/ E9 d' R. ninclude_directories(${OpenCV_INCLUDE_DIRS})" {$ h. {* x: z7 d2 C
" A2 m! U( u+ z6 u% h; dadd_executable(test_matio ${SRC_LIST}) v+ q. q, ^& {
7 P& i: @6 @9 |; x x, e& W" t; @0 {target_link_libraries(test_matio ${OpenCV_LIBS} matio)
+ e/ V0 I: n8 V8 [& M- b" z. R! l3 @+ N; r+ _
( D& P5 C2 N7 B4 o$ o
终端进入test_matio目录,执行1 Q% E" E8 |2 T
C7 E3 t2 i. e3 N& |cmake CMakeLists0 y9 i+ \2 x2 }/ S P* A0 g
make$ v `. |. M0 c7 Z
./test_matio1 I- a% |, r1 G6 J4 ]
# h# c. c9 @4 n! g
+ `' C; \5 L! @
就能在当前目录下得到test.mat
8 ]+ M7 g2 Q0 i6 F% w% h: x! r. L9 _然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。- K# Z; J7 U, T& a( |
9 u. i4 ]5 p& Q$ ^' E* B0 q1 Y o1 l% L
" k2 ]% M2 L/ A& V- b' G: F( D: p4 ^3 W
$ f& P K. O- ~: b7 C4 ` |
|