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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述% ^" m  }7 }' g" \  r
/ U% W# H; W" v( u  L  h& y
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。
) O# P. T5 V4 P2 m0 ~* n. Z0 h1 B0 b( C4 |+ x
: j! U1 z1 Z& J3 P9 m4 b( u
2.解决办法
5 |" P: S7 I- b# r8 m$ g8 @) x  z% ]
一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。
" q) Z; ?# K8 r1 J
7 c; I! z+ }) M- ?3 s接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:
+ w0 d( ~: F. F6 Z
$ E6 A( q/ b0 K4 _% Z6 i8 L8 y2.1 matio库的安装! `, `, h' @) ^2 I2 ^  u
2 S' a6 i" a, Z8 D5 i
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入- s/ p8 b0 _9 o2 s5 q( W, {5 d
: U0 S2 q0 w* s: Q
sudo apt-get install libmatio-dev7 F6 q+ U/ a/ a* A

+ B% ?! j2 _, L
! @, m7 A2 j! H: s8 v9 b2.2 matio库的使用: |2 [4 w. z* ]

0 O4 q, m+ j: l* l下面可以写一个测试的小程序,首先构建测试文件目录! j. z/ P. _# ]% v% |  w) ^2 B
) T' n* ~9 j! x7 ~7 m
mkdir test_matio
* G- B' o8 G& {cd test_matio* P6 j+ m  l% E4 N1 y. i0 @! d% I0 V6 \
touch test.cpp
" Z4 ?4 {5 ^" D; ?; R9 |2 h2 dtouch CMakeLists.txt
# v) Y) S" c' n( P% O* _  m. w1 E; L# l
. C1 a9 }! w( K/ M* Y5 p
因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
0 Z0 p/ r  \3 a
1 w  _* ?  V$ H2 t7 X; o$ {#include <string>& R* l- \* N1 x3 h2 }. f
#include <iostream>
, m: x$ w8 A( u+ e& _. p* A5 I& g$ N8 ]
#include "matio.h"
  Q3 f' |5 z* x3 x2 O
! N3 O8 }2 Q5 r5 J; u0 L#include <opencv2/core/core.hpp>  ~+ o: q2 {$ i- x) g

6 x! Z" i' y' t7 W& u4 G: q/ U6 B
using namespace std;
9 \: h+ S# p3 y" h% x" T( Nusing namespace cv;
  I# \' b7 s. {/ |
& B4 @7 N& l  ^0 tint main()% t5 N3 }) O) C3 g. p2 N+ L% h
{! p4 E. ]3 f8 C+ w
    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);/ u0 B) {8 q! [, x. J: ~  f
    Mat test_vec = test.reshape(1,1);# C6 J: J) O) ]2 t" T3 i  r

" i& N: ~+ ^( M, d6 q    size_t dims[2] = {1,6};
# I- p, }" m* n4 |% g; }3 b' D0 ?& c# i; m
    mat_t * mat;
; `4 p9 R: x( ]    matvar_t * matvar;
$ N, j3 F" D9 [& [
/ M$ i4 s9 |& Q    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
; w2 O7 T9 j# N) u7 f) o    if(mat), v  `4 v. i& `1 |% |2 v- I
    {- k! R$ z. r7 `1 m5 s1 c
        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);- T0 @; r; R1 d( m
        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);- h8 d8 d* r) ?3 A* G) {+ H8 _- ^8 C
        Mat_VaRFree(matvar);/ b  e& V+ O/ ]/ O
        Mat_Close(mat);; a3 T. l+ P' n8 e6 s+ S
    }4 m% f# g& A: U5 y+ Q7 |
    else4 D0 n; n8 ?- P' j7 c# w
    {8 u4 l1 l( N1 ^1 [# A8 j  b/ z. v/ L
        cout << "cannot open the mat file to write" << endl;$ r' C* m1 |' S# Q
        getchar();
, a% P7 q; p( J4 W    }
  D9 _* ?1 z% b$ y
3 R0 N5 P8 v7 D9 \0 [, l! `) P    return 0;0 ^4 X2 P/ Q: e3 w3 j5 ]- Y6 _
}& M2 X$ D2 Q0 ?4 W! W

5 U+ y4 M) X9 r% k# O9 |
- |8 e& z. [1 k1 N这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
% F' T) Y% c$ r! }. H下面写CMakeLists3 l5 J2 N$ {4 ~6 o
. q1 t' A* p* l: u! S$ }
cmake_minimum_required(VERSION 2.8)
2 E4 z3 v8 W$ u& X5 a4 r& b7 x7 Uproject(test_matio)
: D/ @; p) U1 V6 `% j+ o& a+ U  a3 z! c
find_package(OpenCV REQUIRED)
# U/ q8 g3 L( k2 L, N
; o$ k8 b* K% R( c) [% V2 [set(SRC_LIST test.cpp)
2 p- D: u9 O* t0 `* y
4 u" H, b: s; linclude_directories(${OpenCV_INCLUDE_DIRS})
! t# M; m; @4 R' {
+ \$ k: n3 h/ \0 P" T) _+ b* q; `add_executable(test_matio ${SRC_LIST})
3 a  t0 K+ I' u( }4 I/ y% e; D
# R2 M5 b8 @$ ntarget_link_libraries(test_matio ${OpenCV_LIBS} matio)
% A2 _& v' E3 ~! @' ?( K4 }! A  c+ ^9 o" k! c  a; E8 `1 C

, h" X9 a: z3 Q1 E终端进入test_matio目录,执行
3 K/ K0 [8 k* u# Y: a/ I! E0 A: Q  \" W( V" h$ t  d0 s+ x$ E0 z5 z
cmake CMakeLists
% `# j3 ~  |+ K, N5 ]make
) ?, C* _( \7 y# q4 R! `3 A./test_matio/ E9 }4 a8 F3 w' T0 y* I& x

0 d: I  b' q: y5 L! H  z/ B7 c- F; e; Q' i4 Q" N* Y
就能在当前目录下得到test.mat
+ }$ i# Y8 Y2 }0 c- a4 _5 y1 Z然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。7 d2 |6 r& n' L$ g( ?4 x

$ Z8 |7 g7 J% C$ \: K: c: K/ ?' E# D5 \0 T
, n) s- H0 F8 }1 }; o' V$ g6 {
3 n$ T: V* g  q2 S& L1 N

; x+ x; p3 p* h. Y& |9 p& m

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 10:15 , Processed in 0.187500 second(s), 24 queries , Gzip On.

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

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

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