找回密码
 注册
关于网站域名变更的通知
查看: 416|回复: 1
打印 上一主题 下一主题

Opencv(C++)和matlab之间通过mat传递数据(矩阵)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-15 13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1.问题描述
' J1 p$ K/ W) s' x* R- o" j; k, g) I# t1 \8 Q
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。( g8 E- a# _7 \$ T1 w0 E
$ _& m/ k" M7 g; B: h6 \
( d3 H3 T+ r# m1 a& M- c
2.解决办法: _" V- e; x' ]! N* G7 d8 P

4 s& \9 ]  k8 E$ s0 P2 Q( T8 E# M) L一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
$ p( i1 x: {  S
" v8 g% v8 @" P# M- i接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:2 ]0 ~" |: N: }
9 \- `* y0 N( k6 b/ _. f
2.1 matio库的安装
' }+ e: s/ d2 X6 ^: k( w# E% n  d" w3 O& g1 u9 m
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
+ d4 b$ c& Z2 d5 |) S  _6 N
+ F' L/ h1 M- L, {sudo apt-get install libmatio-dev) k6 s( T( n* p5 `
- u7 \5 m' h% s) U% n: t( h
7 u9 |7 C; \6 f5 F# k! y
2.2 matio库的使用
" E9 W( X& J5 G' L) m
9 q. l3 O* N: M7 B; {! u% V7 x下面可以写一个测试的小程序,首先构建测试文件目录" c, O4 p7 @8 S% x7 ]" f

. N- I. p1 \& k( J% e* c: l  \mkdir test_matio0 x5 w8 `( p# m3 B2 M8 D3 I& W
cd test_matio
! Q; Z& o9 \9 @- q' Ntouch test.cpp' y7 A8 J8 n# V' ^5 [9 f; J
touch CMakeLists.txt" d# l0 o+ T9 T1 P  k: c  N

; v! `5 N: b+ T" |0 E
" b3 ~1 ]! T% t  l因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
) y, s9 [7 p3 h2 G4 f; g; N
) I4 V' t" f  O1 n; B5 ]4 \#include <string>$ _; g8 a% F  a1 j+ b, O2 B% }
#include <iostream>1 E7 H% b3 ?4 d" f
) x$ G* v% U& x7 o0 \! I: |/ F
#include "matio.h"
' \' m& ]/ q5 _( ^' C$ q. `% G2 C5 l; ]6 i
#include <opencv2/core/core.hpp>8 I9 l6 ^9 W% `6 ?" D2 S

" C! Y. f1 x% E9 C5 ^0 z- t8 o6 b  t. C. \" |; I6 D7 `$ j( ~0 f
using namespace std;
% N7 Q9 W0 q* q) U9 v  m; qusing namespace cv;( d, U, M8 t$ G7 p( E
( \" ~" C9 ]+ C0 ^: h
int main()/ b- I% h+ P/ x5 j0 k1 o
{
* \# _+ @8 s( X4 {4 H/ u5 |    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);, N% [) }$ ~! \6 ~! Z
    Mat test_vec = test.reshape(1,1);
4 [: S& ?1 ^1 H6 @; j$ t7 C
: ?& b: S3 ~9 b+ ^% L. ~  t" Z+ M    size_t dims[2] = {1,6};
2 Y& ?7 }; L  N! M- d0 N; I
9 v. v( S6 t7 A' S; _    mat_t * mat;# u# c1 u5 L8 d; X# ~+ c
    matvar_t * matvar;
0 X4 z* `0 g) |7 f  S! b$ k' s' Q, D9 O' n6 }, r: j
    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
# J! n3 b- A4 N: S5 ]7 ]8 ^    if(mat)% V+ t( g6 X" F  I. v2 A
    {
4 m6 E$ I5 S) d$ u1 ]        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
' d# ~) ?( X# U) z: V        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);, J" K0 z% s- z3 f) I9 @) l
        Mat_VaRFree(matvar);
- p/ f: O/ `* T2 h        Mat_Close(mat);
% X% m: i7 S$ j2 U    }
/ }/ f2 T: [% }% C6 @    else
: }7 n! G9 Q5 s4 H3 K( q' E    {5 X% D0 [1 o" J/ Q
        cout << "cannot open the mat file to write" << endl;
! Q1 X' N- r( u  y        getchar();
. s% D3 v: ^3 X: m8 }    }8 H" P! B0 t. t/ n! ^

, D( E5 t2 {# E- Y! x, X. J8 N* K    return 0;) y( K0 H- c7 p8 a1 o
}
7 q/ D, T% v+ C- B2 Y+ Y7 a. u* t" T( _0 S& H9 O& A1 k
8 n+ Z+ c4 r( l3 w
这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。 ) l& T9 n! F0 [' i% c% G. F5 @
下面写CMakeLists
: ]& W# ^8 J: c8 {5 [" V' y& ^* V: K% J" n9 L6 d
cmake_minimum_required(VERSION 2.8)* `' z# Q9 X; O- Y; Z- |+ Y4 _  n2 H
project(test_matio)
* z1 A3 T6 t- |3 X8 B
8 [1 U4 X8 Z! z- H& T! `" y0 Ifind_package(OpenCV REQUIRED)4 B( s: y( [$ g3 b7 t$ C

% X: }+ }6 W' }/ a; y& G, e; O6 Tset(SRC_LIST test.cpp)
( e! C. o+ y7 [3 W; t
0 u* b4 Q. u" r/ e+ t# n: pinclude_directories(${OpenCV_INCLUDE_DIRS})
4 u2 C( t4 M% @& W6 `; F& w7 X; [8 I. ~. H) R7 j. w
add_executable(test_matio ${SRC_LIST})
& N5 ?# T) o( ~
9 X: b' y/ e- J) M3 c" n$ g+ b. k6 W; ^target_link_libraries(test_matio ${OpenCV_LIBS} matio)# Q: k" h2 z( E/ F- z

% o) X! [6 X* I/ d- l7 W- d9 d" s
7 G9 W$ R* m* u2 \/ e3 V, a  C终端进入test_matio目录,执行7 q2 O, H% a5 |9 W* ~: M. r

, y5 z- \6 Y3 ~# l4 u' _cmake CMakeLists5 U( c4 m5 _& Q5 s/ r9 s" }
make. Q4 i" O9 c1 ]6 E
./test_matio
' T/ r# T% M# ?5 }' E5 a6 l5 ~7 o7 z. S1 Y: M% z! W

2 i$ o9 Z& ]8 J. H7 i; j/ a就能在当前目录下得到test.mat
9 g5 N! G# Y; L( ~2 q9 n然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。! h" d( X1 f$ `, }+ w
! B6 u# l# ~* [' A

5 M- h4 L$ s- p+ ~& s  C" S& n; |- b  _2 x
" U, _. @/ |; |2 i
. x! N" P. o! u) T; h: p, k: \

该用户从未签到

2#
发表于 2020-6-15 17:15 | 只看该作者
Opencv(C++)和matlab之间通过mat传递数据(矩阵)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 20:40 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表