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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述) P' }0 N) |# Z1 X
+ N/ ~  l+ c9 T- i
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。
* A; {3 l' G& K+ o1 B5 |; b8 N. V6 w
7 f5 [3 D0 L3 x1 |+ \2 `7 u" K9 w; V6 m$ l( F( L& W7 }
2.解决办法2 e8 M$ g' r/ n; c

8 T: v8 j: B" o9 R0 C一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。: L5 z" c0 k; a7 ^7 l7 b

6 n1 J2 Y& L2 G6 Y) ?接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:9 A1 J' H8 P/ n5 S) `
9 e8 P$ E( m) N% a& n7 g
2.1 matio库的安装
  N/ M; `/ `& e1 D) |% C+ N% U) i9 g$ z1 S" `% Q& M
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入9 F3 [9 F/ \* _  i
0 |3 n3 a& \% ], \% p7 y4 ]
sudo apt-get install libmatio-dev6 C7 H9 y  M- n" y! w
+ E6 X7 z& q7 p) R/ T0 c4 _
+ I6 M/ w' v1 V, M) P& H9 h! [
2.2 matio库的使用6 X2 A; p9 j( H

3 U% s: s, E$ k# a. }. |* m8 I* K. P下面可以写一个测试的小程序,首先构建测试文件目录
7 }1 G5 R: C4 O0 N& P, |- p! A
% O  k) i8 X+ M; imkdir test_matio
0 K/ K2 h. W) N. e% _cd test_matio
# N6 K1 A1 K# s0 N* v+ U8 W0 @touch test.cpp
, L0 S% X  W3 S& G3 [# p- l* Ntouch CMakeLists.txt
% s. n- N, w6 \! a6 a
1 X" i& H- k9 C+ c+ [/ i$ L# G3 W: `! ?6 X! N
因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
5 x/ u* f' i6 S  Z7 R9 \4 M
' l' Q6 H8 Y( J0 O#include <string>
5 b) X! h+ ?1 [+ v. ?1 J( X( K+ v#include <iostream>
( F- @* g8 c; G( u& [
8 U( t3 K5 h# h2 I#include "matio.h"
& r/ t  X, o  i$ p
- U3 \. I2 _4 N4 K2 _#include <opencv2/core/core.hpp>( R, z! L: s. d7 A
6 L0 @7 F' M8 F  f) \0 }

: q' ?) G' K! _% P, ~using namespace std;# V; h& ^  ]; r2 L; m
using namespace cv;8 ?% ]4 v$ A+ |
% Q' i1 y+ `9 T# P! }$ o
int main()9 B4 m7 d4 R# \
{5 c; C* Q9 s$ x
    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);( `8 B/ b. B% C" v
    Mat test_vec = test.reshape(1,1);
% C, g  u7 Y- ^4 [0 W
$ p$ u! {8 ]/ M6 k$ a    size_t dims[2] = {1,6};, e' W4 N# U/ H9 k
7 m$ P8 y' ?# e4 \
    mat_t * mat;* Y/ W* Y; g' ~; I# r1 M
    matvar_t * matvar;
0 J( U: c$ {( s. W0 ?- B' Q6 i. L  `  W
    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
) Q  E4 B. V& e% M6 h$ Z) h- H    if(mat)
0 |. |( y# i! S7 Y- `5 f$ z    {$ n# `) b% a) i* R
        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
& w8 a+ ?* D" L, Q: ]: I        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);" }. J; `3 S) f# _! O! d/ {; r$ B% s. x( Y
        Mat_VaRFree(matvar);% k2 @& w. ]% F) X2 B/ p7 R+ K+ z
        Mat_Close(mat);5 p* v5 {4 }9 Q
    }- P  x6 l1 k+ `; i! {* J
    else
. ~# l1 D) L' [" R: O    {
9 J3 K. i3 s, g. K* h! C$ A5 S        cout << "cannot open the mat file to write" << endl;
. Q; d* f5 Q$ ]& v' ^% L        getchar();
' p2 ~7 J: Y0 E+ k4 ~3 {% X- X    }
) s1 M" h8 f; U- j
" I' i. c; i, x* z$ _    return 0;
9 C6 o3 K" D: r. q) Y# ?}
2 ^) E. @* o" w% B6 H3 _
: M- c; j) q' ]# w1 c
+ K: e$ \5 @. d1 [7 }6 R这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
; e/ `: j& R, q  a下面写CMakeLists
: F) I8 r* Y/ \- \4 F+ o" S. _
7 c3 q4 i/ [. {3 R: p2 F- W- ^cmake_minimum_required(VERSION 2.8)
# ~8 h, r2 `0 o& vproject(test_matio)
) C+ m8 p6 V, h& E3 K6 Z$ v2 R8 w' _+ V
8 M% J- x9 f& d- cfind_package(OpenCV REQUIRED)
5 N7 S& x6 i8 s6 [9 e, t) d! L& p: [% H' w2 F1 k
set(SRC_LIST test.cpp)/ l: s% C  R" q# I
, A4 z. L3 W8 e" J& x$ u! F8 u; u+ K
include_directories(${OpenCV_INCLUDE_DIRS})/ W  k' e) Y, T

: F% C8 l; w8 [" Vadd_executable(test_matio ${SRC_LIST})+ \' V/ q, K! U) r3 z. g+ f) r$ R
8 w, u0 R6 q6 w3 f
target_link_libraries(test_matio ${OpenCV_LIBS} matio)& J8 Q% ]4 G# c7 T# a; Y
) C! C) b7 N" m  P# m/ I

' B  P  h! d1 l% A8 `. I终端进入test_matio目录,执行% U  a2 S1 o+ i. ]& Z. N; {+ N

1 ?/ v/ {2 Z# g, [8 @. Ycmake CMakeLists
- b+ G+ x+ x( A/ z6 [8 j! N2 \make
. D0 r/ F- y4 U% k% `3 }./test_matio7 B" D$ X0 h$ }
; H6 }! ~! Q4 g9 @  a
0 l: h- N$ _. F1 Q
就能在当前目录下得到test.mat
2 m) b  q. A/ U然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。8 U% y+ j; f: T1 ?
- r. X& a% q8 [6 D! ^

& M( B- W! V' a# o" ~! y
: C# \/ h) V; g4 s- E1 u: x8 D7 o$ l( W- V6 N

2 l% b$ \5 d/ f. d! b8 P& K

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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