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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述/ O) w0 c/ g; x0 v0 q2 @+ a% x
2 m  M2 n- f% x7 t, A) ^
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。' n3 a' Y3 \9 U
6 B' O' A) p7 ]5 l2 V

7 `; j0 q. I! y/ I2.解决办法
5 w8 [7 k. R6 z, L1 `- {4 ^* K
+ L7 @/ y9 T5 r% Y3 m1 L7 z- A一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
( ?# [4 Y1 n& b% ]
9 m3 o8 x: l- e/ f1 F& [" a接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:7 ^. h9 a6 V3 s, {" n2 `

, S" }& y+ E& Y  I( P0 L! d2.1 matio库的安装
% e3 q, g6 k& n7 [0 @! F& m1 f: e6 c& n1 T7 F, Y1 T
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
' _' C5 b* Y$ {' B6 t: _
/ l9 [3 W) U$ W4 J; Hsudo apt-get install libmatio-dev
  n: a5 q! Y. }, p* l. b; v
, e' Y  \/ S- `2 q
) d4 U' y( E; F: c+ j1 D2.2 matio库的使用
6 D- A' D) q% ~, a0 z1 G/ P( s+ |$ z9 G" s6 f7 ^
下面可以写一个测试的小程序,首先构建测试文件目录+ E, g& J# [7 e1 ]. V) }& F

( \8 U: m* {" A4 c8 Wmkdir test_matio
2 Y1 M1 T. s& _0 j4 s0 G- ^; scd test_matio
7 n* R# L5 [; w, stouch test.cpp
0 X  N" x: L3 [$ o" T$ v& E1 Ktouch CMakeLists.txt( p# v7 ]2 ~( H2 z: M( H

6 h% D/ [' S0 V6 Q" d" z" d& N# b% g1 o. O' |
因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
5 O3 u- I: L( o
$ }) x5 n# D) ?* O9 Q7 c* G* O#include <string>- N8 p* H- S3 v. k$ o+ B
#include <iostream>! q6 [8 M, Y* r: J' q% a

2 Y$ \; _3 k9 C( D. d. X$ ]#include "matio.h", V  r! i; @, H+ ~4 F$ U, P

* s6 A8 C9 s# {/ N! ^% [8 S0 v3 f#include <opencv2/core/core.hpp>
$ S$ G5 b% R/ g/ k4 i. c4 d" S
; ]% d6 x! p/ J0 X) i" O  T* M- v. y, i1 p! X
using namespace std;
) S  w& {" Y' @  u1 o# [using namespace cv;
2 B; L" ^( y+ z
8 L! P( a9 R( xint main()) J7 A$ d, j6 S0 K1 d) i: O+ P) q: g
{
& H9 H+ v: F7 p    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);
0 F# v# n. ~2 f    Mat test_vec = test.reshape(1,1);
% v$ W/ ]2 @/ f  W6 y* S
6 |2 |1 Z* L$ K1 M( u2 \    size_t dims[2] = {1,6};
  y6 {' a7 L# f; c# q8 I" O% m% a5 G& u& z4 h9 J4 k5 u* R7 v# C
    mat_t * mat;- B5 \' L- m5 l( A- ~8 P3 `- ~* F+ i
    matvar_t * matvar;
9 R/ q  o6 V7 q$ i! s8 z$ p1 W5 l; l/ G# a0 F; N
    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
* ]+ m# t! B' c2 _    if(mat)- q$ L* c8 \' e" X' D2 Y: W7 ]
    {6 j1 Q3 n' m/ _3 s- p% Z
        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);
: Z  e+ k. \, ]        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
% M5 t8 U" ~' v% A2 o        Mat_VaRFree(matvar);" L) O) x  s7 f
        Mat_Close(mat);  N2 G4 g% R: L- j) W
    }
% \! ^& p4 ~+ b& y. f4 p' o    else: ?$ a; D  v3 W
    {$ e7 ^6 L( R9 D3 w; ]' b0 ]
        cout << "cannot open the mat file to write" << endl;+ ?" F- O# B. T& B  Y( K+ l
        getchar();
3 J  D$ Q$ H% M4 x* A! B( l, s    }! z4 b( c8 U2 h. l1 Z2 g5 M

& l* w' I5 H4 b  |0 {9 C    return 0;  @8 d8 C/ ~. a! c: w: i
}
! {. x% P1 q& b
2 a" f2 E* \& u' ^, r, q; ^
( m( ^5 Q) n/ R9 b这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。 7 y+ ^0 Z! X* N8 H) n; ]! l
下面写CMakeLists
6 N$ ~9 m3 ]& v2 I1 G$ \5 [& U
- C' N- J" f5 K4 lcmake_minimum_required(VERSION 2.8)
. v/ Y8 c9 C2 H8 o" tproject(test_matio)
. }- Y/ ]* s! Z8 T3 f0 y% P$ j1 b; }" @
find_package(OpenCV REQUIRED)
. j- U8 ?! [2 d" Q
  m. U# h6 w- B6 j; nset(SRC_LIST test.cpp)$ D4 W4 e7 p$ k: D9 Q3 u3 b/ }

$ j+ X% O$ g7 R! C8 x- `include_directories(${OpenCV_INCLUDE_DIRS})
$ c' \0 m. \3 o4 f& H! |4 c: {8 C" H, C5 T# V6 {7 A; }! k( u
add_executable(test_matio ${SRC_LIST})
4 l# o2 }0 Y) r: q$ F+ ~8 l6 t3 a( j7 W
target_link_libraries(test_matio ${OpenCV_LIBS} matio): i' E3 w3 B; h8 f
; l% g! ]& Q# ]: B. R
; m$ J* y: k. I2 f& S' F
终端进入test_matio目录,执行
% @* ]/ Y( ^. |) B8 M4 z
5 k  R$ r: ?" {3 R8 x" e4 y4 n6 O- Jcmake CMakeLists3 M2 w0 W8 h: a0 I
make
& D3 V8 U# U& K+ f./test_matio
) _: l- X* D. X5 D1 o8 _4 p1 T8 z) s. j7 j: D2 W
( E9 ?  G0 r3 J5 {, b' X
就能在当前目录下得到test.mat 0 z+ I( n7 ]2 x2 g1 a) k" Y7 h
然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。* y! o0 E5 Y7 O3 S) k5 {
' R' }6 Q8 z  d/ X4 i
2 e; H2 [; i9 Y0 J+ ~$ Q6 m* p
6 A; r: D  d' T" o& l0 Z

6 b8 {2 \0 g: f7 l) ^5 x" [* v6 A/ r7 b- b' f; ~9 E5 g9 U

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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