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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1.问题描述
2 b8 G; t, ?6 d6 V% w! y% ~/ g( C- Z. u8 e4 I' V) _5 \
最近做科研项目的时候碰到了在C++里面利用opencv计算得到了矩阵,但是需要在matlab里面核对矩阵内容并做下一步处理,因此需要在C++(针对opencv)和matlab之间进行矩阵数据的传递。5 Z6 ^6 Y7 q0 h$ D% W
& J! Z& _, ?: L" r0 O- c6 l  v! d

( O% B- i* U* Y+ B. Z* G; C* \& c2.解决办法# A8 b7 Y* Z+ k

# e, Z5 P  B  I' h) d/ {一开始想的是,能不能把opencv产生的矩阵数据写到xml文件,然后matlab读取,但是实际操作过程中,发现matlab读取xml文件的矩阵数据,在转化到能处理的形式的这个过程太耗时了,十分不理想。我要处理的是视频流产生的矩阵数据,用xml的方法肯定是不行的。* z. b" H) \' G) O5 A& k6 z

# W) O" X; S$ j5 ]* N接下来尝试用matio这个库,这是一个C的用于mat文件读写的库(Mat IO)。下面讲一下这个库的安装以及应用:1 i) n7 U3 \7 S9 T
# P; W# K- m7 \, \1 x! x: B
2.1 matio库的安装
$ E( S3 n2 l& O8 @+ S# N2 Q7 v4 K
matio库的安装可以通过源码编译,也可以直接apt-get安装。我是在ubuntu下面跑的程序,所以为了方便,直接在终端输入. m$ [$ w9 y' g( o7 ?$ _. R* j3 D
0 K# b' f3 I( |
sudo apt-get install libmatio-dev2 Q9 F9 v: A" x! Q
. S$ T  V& [5 Y1 s
) k& l0 |8 h. z' ~" L, O$ s; y
2.2 matio库的使用
/ z& M- g# @6 X# s; T7 A
/ ?  ?+ J1 H" E; l下面可以写一个测试的小程序,首先构建测试文件目录0 i) c* u, F/ }

. ]; o' I( U7 D2 [0 nmkdir test_matio
9 z8 R* _: i! m+ S9 M3 zcd test_matio$ \( g" [; c% U+ z' N! @& q* w- {
touch test.cpp
' O5 O$ j1 I) x: O3 L; ~touch CMakeLists.txt
, n' K. T" Z, R+ W- Z3 k7 k" W" }( W) L; v9 E+ P  X8 D

" n  t; l/ y2 |& N8 @" a2 C因为要引用matio的动态链接库,为了方便起见,直接把matio.h和libmatio.so拷贝到了test_matio目录下面。所以现在的test_matio目录下面一共就有4个文件了。接下来写测试代码:
5 e/ U/ X5 E% r& Y
. |, \$ V7 L6 x) ~6 `  w#include <string>8 J, C" |% Q. ]. p( }( D
#include <iostream>
" I& O9 C) p% X! o
9 U2 }" S6 u- B8 n* T4 d#include "matio.h"
- U3 K# B3 _8 f
. c* d& _$ ^8 j#include <opencv2/core/core.hpp>
5 O9 b- O8 r* R* m5 k
) K, e, g' o. P3 H) _. H
$ N+ T: v& W, U5 K! L( S) w: D# `using namespace std;
& S+ \' s, C4 E1 pusing namespace cv;
# z$ j: S) M: |" O3 j+ k- @
% j! q2 K; j8 v0 c; A# uint main()
( o6 |# P3 ~: `$ z3 r{5 c" ?6 g8 g: ?* l7 E+ |
    Mat test = (Mat_<double>(3,2) << 1,2,3,4,5,6);0 }" v8 G6 C" V& H' S" b: J5 L
    Mat test_vec = test.reshape(1,1);
% y! j  r0 R% ?. p
& A, H% q/ l7 Q3 X    size_t dims[2] = {1,6};
6 g& B* t. t0 U$ g0 \9 V
. K/ y5 X7 L& W    mat_t * mat;
$ `9 P( e, i3 w1 J. `    matvar_t * matvar;+ q" I( t% h* [

. d7 K  v& ~! G9 ^# B( {0 E    mat = Mat_CreateVer("test.mat", NULL, MAT_FT_DEFAULT);
$ y; r" m7 I& E    if(mat)" K8 D6 G( m" F  ^) C/ r' m
    {
+ Y9 P+ j, z# w# ]  O, k$ u" {# G: |8 j; Y: g        matvar = Mat_VarCreate("test",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,test_vec.ptr(),0);6 O# |5 n3 ]2 b
        Mat_VarWrite(mat,matvar,MAT_COMPRESSION_NONE);
; J: H7 B: |4 ~) {, H! j7 {        Mat_VaRFree(matvar);- i- j$ u0 `1 j6 X
        Mat_Close(mat);
  b  a- p7 l5 H    }" W; @: J7 i! M& R$ {, o- `; Q
    else7 ~# k' o* q" L$ ^# ]
    {
+ a0 K) N2 y5 }        cout << "cannot open the mat file to write" << endl;
, }0 o6 P; K; C: A' j; f        getchar();
/ T. |- v- Z5 _4 s, T* ]) d1 H    }. _& F* X5 q9 N. g0 `
' d2 `8 f3 D, h! u- S: J3 I# V
    return 0;
3 I% y" d! N+ S* V}0 q: x$ g, [" ^/ S" A0 {
- l! v# E+ ~0 }% ~

) {# ?/ d/ d7 x, @9 q' H% k这里reshape是因为Mat_VarCreate这个函数只接受一维指针的输入,对于opencv里面的Mat数据类型,我就只好先转成一维存储,然后在matlab里面再reshape回来。
  s3 S0 M1 l0 U' N% y( G% N! q下面写CMakeLists
% D0 e8 U" Y% M6 F* ~8 m* D, ~6 \, D6 C* ]4 M: I: V6 d
cmake_minimum_required(VERSION 2.8)
( N; ?* X( W5 N9 Oproject(test_matio)& I/ l9 ^; d( A! {
. X; L9 A8 x* c$ a+ a2 e
find_package(OpenCV REQUIRED)
3 F5 E3 v* j; E, [* D2 F9 k
. \$ j# Z0 S1 R0 D1 H# {3 eset(SRC_LIST test.cpp)' a# g- f" W: V& o) `7 m2 m
6 i$ g) F- w6 d$ {! h; C' y
include_directories(${OpenCV_INCLUDE_DIRS})9 i6 {7 a' W! ^
9 c5 o5 t1 U/ A) J% f: D
add_executable(test_matio ${SRC_LIST})
( j& _4 B6 A0 L* ^, O+ W
/ A' e3 [8 c  ftarget_link_libraries(test_matio ${OpenCV_LIBS} matio)" t6 }7 @6 [( q7 u) m

+ E- {% j4 T0 X0 k% V3 R
6 M* |9 Q, n0 m- `; E; o终端进入test_matio目录,执行  S1 a4 p" p8 F

' ]/ j# e! E0 N$ L6 j9 Pcmake CMakeLists
# p1 ]1 v* O/ y  Qmake
9 ?' N" n7 f8 U" _4 _2 B0 ?7 h./test_matio
0 A: q8 ^1 u0 ?: a3 ?9 ]1 j5 b0 t6 o" l, O

8 x6 ~4 b! v1 ~就能在当前目录下得到test.mat
0 x# e4 ^) p7 ~# L& u( W+ F: `然后在matlab里面load(‘test.mat’),在reshape回来,就可以得到原来的矩阵。  e! r7 F/ r1 f2 e

5 }% J  `4 }9 f7 u5 v& v& r# O+ m) Q, l

+ I; M/ v. u0 Y, w8 Q3 W+ k4 k& f- G8 i# C
3 X  G' L: u# @/ ?0 e

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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