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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述
+ E5 A/ s$ m4 n3 l# M
: C$ p( W% g1 y4 x- f1 U6 Z最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。# k( a3 \3 r( {& k/ I( b' f
/ J4 y1 W; L* U3 P6 x

/ ~; ?' h: T5 Z2.解决办法+ J9 o) T: p% S/ l' h( ]* L

- A6 D& U+ d$ k. _4 u" c" |* f一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。# u0 N; _: Q+ L/ D& l; z
$ v; u* r/ }8 a' y, l
接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:
" R" g# n: z8 M8 J* q
% V9 T. \, n' X  }9 M8 v8 b+ h. z1 G1 \2.1 matio库的安装
  {4 g( t# f  ]& u
+ y* t- s- E6 ^; {# y7 m1 Z' j( i! fmatio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入
# T& {9 L9 {) ^- ^  w' o
+ |* `) C( G  Y! l" _" zsudo apt-get install libmatio-dev+ Y" C% F2 A9 |4 S$ n" Z: q$ p
- z! a0 f8 J: c( o' B

  k* V9 {6 Q1 A1 ~/ ~4 y! c2.2 matio库的使用! f' W4 K% D* D& ^
; J5 U! s1 S/ X' }
下面可以写一个测试的小程序,首先构建测试文件目录7 i. |0 z4 ?( Q8 l% h$ _

7 a; p' k! L" `mkdir test_matio
4 U' j) f; C( o7 v5 @3 V4 ucd test_matio
! j$ f) d8 R$ B+ s  d7 xtouch test.cpp
( W' d' g2 \/ I3 Ztouch CMakeLists.txt
% c& t' w. K9 U& `! p* ]9 B2 ]6 S' T0 O: r0 O, ~

% [" C0 ~0 z4 X* u9 _1 w$ [" F& h因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
6 j' O' G: q6 C6 e
- N: I  @2 h" ^5 T7 a& X#include <string>
1 {$ L; ~2 m) V) g; m+ I#include <iostream>" s3 v. _' J' x
8 ?+ ]2 K3 |3 W2 z5 g* }
#include "matio.h"3 a5 U/ t, E$ ]3 z8 X* {: f' J7 x

9 `3 u1 k8 {! N3 D% o#include <opencv2/core/core.hpp>
! [: P+ N/ c# X5 o5 {
7 `/ o2 Z+ L; ?$ W3 @! x4 }
7 y9 D. j* h* q- G1 M6 |using namespace std;
! v. U% H2 X; u6 L) `( Qusing namespace cv;/ i2 Z; T  m4 k4 u
. Y& U2 I& }( L: L9 o8 U/ C" U6 n
int main()+ o$ e8 S0 e: g3 Q; O  M  B
{
: L2 l  R. s9 @+ e. p# S    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);$ R3 r6 q' Q8 a/ D( g
    Mat test_vec = test.reshape(1,1);9 H+ K/ x+ ?+ w) s# J6 N( B; C

5 i1 j' |* V3 A& ^    size_t dims[2] = {1,6};8 |  K" q7 \6 n1 F

( c7 I$ I/ T6 ^    mat_t * mat;  C* h" e1 f. f
    matvar_t * matvar;3 Y$ K3 @4 v) i9 b& O; ]- E

/ s( n5 n' P" Q" q5 a( P# h6 Q5 H' V9 J    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
3 a& ]7 O8 i3 L6 e! _    if(mat)
* d5 h5 C; ~$ H8 G2 h    {1 [/ _* @$ r) t$ [
        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);/ W& p/ z( Q5 c6 q7 R
        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);% C( C) Q8 T0 ?4 N0 g1 U
        Mat_VaRFree(matvar);
! B) R/ t$ o( W# P3 o. O. m        Mat_Close(mat);- c  o8 f$ P( A" x
    }
* i/ @$ k" H3 x+ t& V. l+ O6 e    else
8 M+ f8 r. b4 d    {/ p- y9 V- t. y- a# g3 a" ~
        cout << "cannot open the mat file to write" << endl;
; K5 ]0 d& @- G3 V8 X2 J        getchar();5 ^0 E: b) n' Y3 n$ c7 h
    }
+ U8 ^( _4 `4 ~! x7 v, p# U) f: C( v. e  I/ ~
    return 0;
" \; U* `: J5 b" c; j}
+ z* b. H. v6 W  ]9 |& r+ k, t6 R& }# ?( i
8 F9 [5 |$ ]8 V6 g4 m- d
这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
$ d# I; i6 h2 N& N% z0 U下面写CMakeLists
( [* `. N& T, ~( j. ?+ X
( d( V+ Z9 U% p3 g! U3 o3 X* d2 L* ^cmake_minimum_required(VERSION 2.8)( p( N; R* v" k, b! _
project(test_matio)
9 @4 g& q7 [, d' y0 |2 d) }5 b$ N! s/ @4 `  `& `' _% a$ X: x3 M3 D% v
find_package(OpenCV REQUIRED)
6 C7 z& I! v0 C& w& W' E
- r2 C' m- i  f4 O% p* Kset(SRC_LIST test.cpp)
( p$ ?) \8 A) Z+ o( [" {  _' P
8 R! u3 ~/ E9 d' R. ninclude_directories(${OpenCV_INCLUDE_DIRS})" {$ h. {* x: z7 d2 C

" A2 m! U( u+ z6 u% h; dadd_executable(test_matio ${SRC_LIST})  v+ q. q, ^& {

7 P& i: @6 @9 |; x  x, e& W" t; @0 {target_link_libraries(test_matio ${OpenCV_LIBS} matio)
+ e/ V0 I: n8 V8 [& M- b" z. R! l3 @+ N; r+ _
( D& P5 C2 N7 B4 o$ o
终端进入test_matio目录,执行1 Q% E" E8 |2 T

  C7 E3 t2 i. e3 N& |cmake CMakeLists0 y9 i+ \2 x2 }/ S  P* A0 g
make$ v  `. |. M0 c7 Z
./test_matio1 I- a% |, r1 G6 J4 ]
# h# c. c9 @4 n! g
+ `' C; \5 L! @
就能在当前目录下得到test.mat
8 ]+ M7 g2 Q0 i6 F% w% h: x! r. L9 _然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。- K# Z; J7 U, T& a( |

9 u. i4 ]5 p& Q$ ^' E* B0 q1 Y  o1 l% L

" k2 ]% M2 L/ A& V- b' G: F( D: p4 ^3 W

$ f& P  K. O- ~: b7 C4 `

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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