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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述( d5 e# T5 Q1 b9 b& \' `2 T; l
, u2 V6 g* s* n# J
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。
; m3 M/ \/ c- o) t7 J
5 _  I; f$ ~3 J. R# }. f3 W5 j& V5 R: Y3 e, D2 o- q7 m
2.解决办法
" z( |& {# ]9 s1 S+ V* k& X! G, b5 b1 z( t2 `4 x
一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
' L0 O0 [/ m0 X: z7 ^9 n! `5 d( r
0 f- |! V8 D! O* x! M5 b接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:7 J, A! v! s. [% S2 p

3 a1 s5 D6 y; |1 t8 Y2.1 matio库的安装# j( e4 A, I% _5 q  @% N: ]

+ i0 T* P; R/ ~' n  W% }matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入  p, Q3 A- l& R4 {' H
# u9 S2 T% z1 o/ W6 o% V
sudo apt-get install libmatio-dev! S) z2 C% g) [: r

* I5 w9 H* |7 [0 i' a( _% \
3 [# z. q9 W% m  v) ]0 O1 ?- i2.2 matio库的使用6 N7 g8 T' v$ J7 H. G
: v$ e" r" v4 a) w" W- v
下面可以写一个测试的小程序,首先构建测试文件目录" u# U. h, ~, Z2 L% w8 k* E, I

( s3 t! i8 j; ~# |% ~! l3 t" `8 E) gmkdir test_matio' {$ g9 [( Z. Z
cd test_matio0 V1 n& m0 f5 I- x
touch test.cpp
) O! Y- c- n9 x5 v- j, x' }0 Wtouch CMakeLists.txt
( Y4 f5 N1 V$ A! [; u. ]) Q' L& m2 X, p# T1 C3 t4 I2 i

" c9 V0 d9 L( [  k% T. g5 a( _因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
6 D3 e! B) p% g  o% ]( S4 {! k& H5 m$ s2 a
#include <string>
( I; `& f& G$ E* T! @#include <iostream>, G  w! m) L4 Q
  ^2 @8 `6 E! c  B# g8 Z* ^8 a; M# p6 `
#include "matio.h"
" E# C5 E5 j4 j% m* ^0 F0 y1 V. W# `2 k" D
#include <opencv2/core/core.hpp>
* E& m6 Q# X; S0 y& j5 P8 @( L
: w0 k: A$ o3 F( V' M. C& }- S1 A8 z  U8 a# T
using namespace std;$ Y# n1 T* c$ p2 t
using namespace cv;" g; ^1 A, U! S  O' G. ^; L
* U4 g4 ]. M/ G( m
int main()
9 B+ k) _9 ]: Q9 e5 \4 Q( o" D{6 ]3 {; w) e& J' C+ G
    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);% V2 T+ }7 `+ ^2 u" C
    Mat test_vec = test.reshape(1,1);
7 `& @$ v7 X* g* k2 Y9 k2 |% ^: a+ [9 s6 l
    size_t dims[2] = {1,6};
* U; Y7 c) D& ~: R2 S+ O+ l0 M* J% Q
    mat_t * mat;) W7 [* L( |' w( h% b
    matvar_t * matvar;
7 U1 h6 R  O; s
" E& ^) u1 L" ^; G4 \, H    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);# D- y$ x/ n& r. q: f+ a' Z0 T: M& J
    if(mat)
; T3 x( W) d/ S& \' `  B, A    {
( c; \: ]% }- d; Z' K* X; |        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
7 q: Y; e1 l, i  S" n( g        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
7 B% w' |9 m/ g8 C        Mat_VaRFree(matvar);2 k+ r" t9 a6 |# Y
        Mat_Close(mat);0 P8 }: n8 l# @5 A( f- i0 N
    }
& C8 y( V6 h& N8 j3 b2 U. y8 v    else7 [; M; s& O' ?( ]! C7 \& t# b
    {
' I" m& D1 o% a7 w6 {: K3 \$ b( N5 V        cout << "cannot open the mat file to write" << endl;* s) ~' X; m1 I9 Y. i( t
        getchar();
8 R% {) k3 q* s; i8 _    }" G) h6 G: a' ?, L) `- N
2 w% V( H3 c2 Y9 k( Y* E
    return 0;3 F$ u6 g$ Q& F( a$ Q
}
$ @! d3 i  X  s
/ G, g# `3 _7 I1 v  [
+ l, J% [: X5 p5 A这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
& N% C  j: d! ?1 c下面写CMakeLists
. Q' H! h+ b4 Q4 F3 [7 C0 c8 s' R- G2 U9 E- O3 s$ |3 y
cmake_minimum_required(VERSION 2.8)
' I6 g$ N2 a$ K  Eproject(test_matio)
8 d3 \4 `0 @, }/ }6 g; t( {; S
' ~6 X1 u1 v. qfind_package(OpenCV REQUIRED)
! D2 Z1 f* J- }2 V, |( L) g7 a. r4 ~5 h: `
set(SRC_LIST test.cpp)
, |8 r/ B! |$ x* B7 t. P
* `- j7 X& f' Y; c: p) o* |) Linclude_directories(${OpenCV_INCLUDE_DIRS})
9 h4 z2 j/ H* M0 ]0 `- m$ j4 ^5 E# M" U6 z# D
add_executable(test_matio ${SRC_LIST})3 b" ]+ @3 J1 {( t

7 ]! b9 m: Z9 {! Ttarget_link_libraries(test_matio ${OpenCV_LIBS} matio)! {1 ^* m2 [: O
2 ^% d- _8 z" ~$ ~% H1 N! F

& y/ J8 W5 z. O1 ~2 e终端进入test_matio目录,执行
& [) X( B: ]( Z$ P) ?3 N7 i
! W' a& L( f( S+ J& q& scmake CMakeLists) Q/ w6 h) v* I' }
make
! g( |$ Y  Y3 Z0 _./test_matio
7 I2 S; e7 {; W& c
: i6 L7 ]- g' ^6 L4 l4 q# O* Q5 h2 V% K' v
就能在当前目录下得到test.mat
3 a- t  F" T# f- [* Y8 B! N然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。1 P6 f: [( z: |4 w

/ t3 E2 o$ J# |) X! w1 q/ K& L0 J
; [3 y4 _& P5 O- Z

1 B; E# F! U# p, ?1 Z3 B1 t
& n$ n: p4 F+ i) f

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 13:04 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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