C++版本的Opencv与matlab矩阵数据通过txt文件传递

最近需要用matlab和C++协同工作,为了规避代码从matlab转化为C++,只能转化数据。(我也转化过代码,发现matlab对于矩阵的计算还是更方便而且快捷)

Opencv 中对于数据的存储好像只有xml、yml等特定格式的文件,而matlab不太容易读取此类文件。于是,我参考了一些网上的方法,写了一个通用版本。

包括两个部分,opencv写,matlab读 与 matlab写,opencv读。此为小儿科,单纯的记录一下,以后直接拿来用即可。

注:为了方便,txt为一列,前两行分别是行数和列数。

1.opencv写,matlab读

//@brief save Mat to txt files
//the Mat type must be double
int Mat2txt(Mat D, string txt_name)
{
    D.convertTo(D, CV_64FC1);
    ofstream fout;
    fout.open("txt_name");
    fout << D.rows << endl;
    fout << D.cols << endl;
    for (int i = 0; i < D.rows; i++)
    {
        for (int j = 0; j < D.cols; j++)
        {
            fout << D.ptr<double>(i)[j] << endl;
        }
    }
    fout << flush;
    fout.close();
    return 0;
}
%the txt must be one col
%and the first and second num must be the rows and cols
function[data]=txt2mat(txt_name)
txt_data=importdata(txt_name);
r=txt_data(1);
c=txt_data(2);
data=txt_data(3:end);
data=reshape(data,[c,r])‘;
end

2.matlab写,opencv读

%the txt must be one col
function mat2txt(txt_name)
fid=fopen(txt_name,‘wt‘);
[r,c]=size(A);
fprintf(fid,‘%f\n‘,r);
fprintf(fid,‘%f\n‘,c);
for i=1:1:r
    for j=1:1:c
        fprintf(fid,‘%f\n‘,A(i,j));
    end
end
fclose(fid);
end

  

//@brief string to num(int,double...)
//#include <sstream>
template <class Type>
Type stringToNum(const string& str)
{
    istringstream iss(str);
    Type num;
    iss >> num;
    return num;
}

//@brief get the txt file from matlab
//the data saved in txt must be one col
Mat txt2Mat(string txt_name)
{
    ifstream fin;
    fin.open(txt_name);
    if (!fin.is_open())
    {
        cout << "the file can not be opened!" << endl;
    }
    string temp;
    Mat A;
    int line = 0;
    int r = 0;
    int c = 0;
    while (getline(fin, temp))
    {
        line++;
        if (line == 1)
        {
            r = stringToNum<int>(temp);
        }
        else
        {
            if (line == 2)
                c = stringToNum<int>(temp);
            else
            {
                A.push_back(stringToNum<double>(temp));
            }
        }
    }
    fin.close();
    OPENCV_ASSERT(A.rows == r*c, "TestCvError", "the size doesnt match!");
    return (A.reshape(0, r));
}

原文地址:https://www.cnblogs.com/xilu/p/9102770.html

时间: 2024-10-08 11:13:22

C++版本的Opencv与matlab矩阵数据通过txt文件传递的相关文章

matlab————矩阵输出到txt

matlab如何输出矩阵到txt并指定数的精度 (2013-11-20 16:50:43)转载▼ 标签: matlab 输出数据 假设你的数据矩阵为a; [m n] = size(a); [filename pathname] = uiputfile{'*.txt','Select Save file'); if ~filename return; else str = [pathname filename]; fin = fopen(str,'wt'); for i = 1:m for j =

使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出

在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把数据写到文件里,用matlab读出来,然后用matlab各种高级功能查看数据的值. 1.将Mat的数据写入指定文件 为了方便拿来主义者,我直接把这个函数贴出来,你只要把代码拷贝到自己的代码里,就可以直接用了.如果有问题,赶紧评论,我会尽快看看问题出在哪里. #include <iostream>

matlab矩阵内存预分配

matlab矩阵内存预分配就意味着,划定一个固定的内存块,各数据可直接按"行.列指数"存放到对应的元素中.若矩阵中不预配置内存.则随着"行.列指数"的变大.MATLAB就必须不断地为矩阵找到新的"空的内存",从而导致"建造矩阵"的速度大大下降. Hilbert矩阵的数学描写叙述 Hilbert矩阵是著名的"坏条件"矩阵,当中其第(i,j)元素的表达式是a(i,j)=1/(i+j-1). 代码比較: % 20

OpenCV快速遍历矩阵元素方法

OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row) 行指针的方式定位到每一行,可快速遍历矩阵.例程如下: 1 std::cout << "The inverse matrix of K is:" << std::endl; 2 for(int i=0;i<3;i++) 3 { 4 float* data =

matlab矩阵合并及相关运算

1.matlab允许向量(和矩阵)合并,且matlab提供了两种合并方式,[a,b]和[a;b],两者的结果是不一样的. a=rand(2,3): b=rand(2,3): c=[a;b]: d=[a,b]: c的结果是将b整体合并到a 的下边,而d的结果是整体将b合并到a 的右边. 2.创建等差向量组 a=[1:2:11] 注意涉及到向量内部对应数据之间的运算时一定要用点运算符号,(.)例如,求表达式b=a^2时应该写作 b=a.^2 也可以利用linspace来创建等差向量,linspace

2014.08.04,读书,《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础

第1章 MATLAB数据基础 虽然一直间或使用MATLAB,但从来没有系统的学习过,现在开始也不晚.先对几个重点或者平时忽略的要点做下笔记. %后的所有文字为注释,多条命令可以放在一行,但要用逗号或分号隔开,命令后的逗号表示显示结果,分号表示禁止显示结果. 符号…表示语句的余下部分将出现在下一行,但不能出现在变量名或运算符之间. M文件又称Script文件,具有全局性,文件中的所有变量在整个工作环境中有效. 命令: cumsum(x,dim),求累积和,matlab中cumsum函数通常用于计算

《学习opencv》笔记——矩阵和图像操作——cvSetIdentity,cvSolve,cvSplit,cvSub,cvSubS and cvSubRS

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

《学习opencv》笔记——矩阵和图像操作——cvInRange,cvInRangeS,cvInvert and cvMahalonobis

矩阵和图像的操作 (1)cvInRange函数 其结构 void cvInRange(//提取图像中在阈值中间的部分 const CvArr* src,//目标图像 const CvArr* lower,//阈值下限 const CvArr* upper,//阈值上限 CvArr* dst//结果图像 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream

matlab三维数据绘图

 3D数据绘制唇部图像主要由两部分构成,一个是唇部在X-Y平面的栅格,一个是根据相应Z轴的涂色.主要使用了matlab里meshgrid.surf和shading. 1 使用meshgrid生成栅格 meshgrid(x,y)由向量x和向量y通过复制的方法产生绘制图形时所需的栅格数据点矩阵X.Y.该命令产生栅格数据方法为:将向量X作为矩阵X的一个行向量,并将向量X复制length(y)次,以构成栅格数据点X矩阵:同样,将向量y作为矩阵Y的一个列向量,并将向量y复制length(x)次,以构成