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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述
+ ?0 b9 x/ J& r/ i! P  x  q6 y. m, J" d# @
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。
1 P: M" z6 p" R# d9 Q3 z
% R  U$ k7 a) q6 b  O* R' `2 z: W, D# P! b5 m6 t
2.解决办法' k7 m% H3 P; Z2 @# C. i# }

5 @, d% K: ]" w一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。( h/ H$ |! _9 z% l7 d

5 a: @' e& H( q* _; A+ w0 V接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:5 n0 M1 O7 c3 k8 Z; o, Z) c/ e
/ y! ?3 v) J) q, \# f
2.1 matio库的安装% l: ^1 f$ n. _/ E& N

% X; N' D9 m0 g/ D: T- ?% s3 Nmatio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入/ e! s2 T9 T* @

7 D  s' G5 `4 W4 Fsudo apt-get install libmatio-dev1 ]" f( ]% ^% J' `

; m! _0 D- p5 I5 x1 b! M; O
) x" M8 K/ ~6 X8 ^6 p2.2 matio库的使用: B! b: v0 I. u( e+ X5 d

4 B# k0 S$ e  |下面可以写一个测试的小程序,首先构建测试文件目录3 [) i  T8 u; ?% U3 R! {; E

# D8 k- W0 M8 b& L. p( T3 vmkdir test_matio
  a. j, I5 b+ g  ]cd test_matio
6 b& B( E0 g7 a. ztouch test.cpp3 |7 C1 s4 j- d& ?( h2 G2 X  U2 I
touch CMakeLists.txt2 z( {9 _& W3 m# y) R) X& q/ K9 y
; _4 x: P6 }% A

. o; F8 d/ T1 q, I" z, v9 S3 u因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:9 b: E0 E+ ^. I% B" V9 D! d/ o- a7 D

8 {" O* y% {7 R#include <string>- ]. H1 e; v$ {6 }& |
#include <iostream>
; O6 B! v& m4 d& I4 m' L6 F
: _/ D4 }: Y0 V#include "matio.h"+ U( U+ ]4 v* U: W3 u+ k2 Q( Y7 t

8 O7 Q9 n7 M' `5 o8 v1 Q* ~#include <opencv2/core/core.hpp>  P  |5 a7 s& T- a0 y+ S4 K* L
; L( T1 b; `" {8 d

' \- c& K3 L; t, u+ K6 `! }/ Xusing namespace std;
4 G- \6 e* u$ a* U* [; n! Uusing namespace cv;; b( i' F+ v" T6 s" D- R' `

" J5 p' ]3 L1 U7 Q# |) i, lint main()
1 i6 k% L" l  A. T# E{8 d/ v) X* M0 }; H# X7 |
    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);% o' J1 W- B( f2 e& N" O
    Mat test_vec = test.reshape(1,1);
8 g4 r9 |. D# u4 U, v$ V* v8 I1 A) D# {& C7 q3 B/ E* T! r
    size_t dims[2] = {1,6};
% T! R! Q+ e: `0 O' [% C  f; X2 K
& p) u6 x  _$ Q    mat_t * mat;9 \% I" _3 c+ Y' |9 m8 V7 B/ w
    matvar_t * matvar;4 [6 r5 ~7 ^& Y+ h0 ]* [

1 @* ^/ C9 z3 J/ B8 q; x    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
. U) i" q- D- K$ w$ H2 O    if(mat)# t, R1 s9 Q! u9 |" e8 D! u
    {
  ?5 p2 @8 s0 o: w1 z2 Y* W2 O        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);, O  c8 R+ Y; C' r7 g6 c2 `
        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
+ Y+ Y' ]( C' ?6 p# E        Mat_VaRFree(matvar);3 Z, T' c9 Z3 A) Y
        Mat_Close(mat);
5 H* r8 c/ |8 V" G+ U    }. C- a& D' Y' Y) p' @
    else. S5 k0 [1 a7 S# I
    {
4 R/ f+ w) H6 M- k4 C6 E0 ?        cout << "cannot open the mat file to write" << endl;$ Y- L4 Q8 S8 f6 L; N6 G9 _
        getchar();
" k$ o$ V+ G8 q4 ?    }
( Q0 q$ z4 t; Q# ~* l6 \# L# r9 @8 G4 C
    return 0;2 J' x3 @+ c! F; V8 m
}
% m; O" ^% j! J# X
. N  r! C1 D5 T5 q9 }9 d
8 _( F' z& \% k& b8 L5 z. M这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
( a' N$ Y4 W1 E9 W' h下面写CMakeLists
) i0 n8 i3 [# X! F+ ]  y1 `2 ]
' W# s  i% k4 a1 s' f- Jcmake_minimum_required(VERSION 2.8)
5 V& ~' Z" w) P4 T2 Vproject(test_matio)2 r! p/ j3 ?8 B& f. V

1 n$ u0 F" F3 u, L( e( m5 E% kfind_package(OpenCV REQUIRED)
# e8 d2 G6 K) Z2 Q- [9 m6 N+ E$ U' q' ^7 _4 P7 |
set(SRC_LIST test.cpp): O8 u( b, Q) B5 x) m3 _3 _

, Y( a8 S5 N8 \" l$ E  ^include_directories(${OpenCV_INCLUDE_DIRS})
/ c3 B8 i0 A8 S* s% B/ e* w8 `5 n$ p1 ^- o0 N2 C
add_executable(test_matio ${SRC_LIST})
" o8 g+ [( M' M. n- @3 U/ |' c5 \3 N; [0 n
target_link_libraries(test_matio ${OpenCV_LIBS} matio)% ~" X& n2 E1 U7 U
( m4 ^& c8 o' {, p5 k, l6 ]

" K$ m* t# m2 F  B终端进入test_matio目录,执行9 Q) q9 w4 V9 R& w4 L! X
2 d- F) F2 o' x- Z( h% _6 n
cmake CMakeLists
2 N0 P) L+ D, z6 m4 X+ Mmake
- \0 y6 }: F! x1 {) J4 z( k./test_matio3 P/ \; y3 Q5 j  ~0 C: `

3 @% k( [5 }" k8 s, u: \2 \4 z; e. c, X
就能在当前目录下得到test.mat * `0 P7 `4 P* m5 ?
然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。
8 I0 R& J6 G+ k! B$ ]1 [/ L6 B- C- ]4 }

. N9 }* {/ O8 y# L2 K. `8 ^  [
9 Z$ o" z; i( M. Q& \4 W& f, S" m5 i% X1 i5 M& G( N3 {

4 Y! _5 Z! l4 l

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 11:54 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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