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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 08:35 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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