opencv和matlab矩阵类型数据相互传递

由于平时需要经常用到opencv和matlab处理数据,所以,实现两者之间数据传递,是很有意义的。 本文记录了opencv读写txt文本、matlab读写txt文本的方法。并借助txt文本这个中间媒介实现两个软件的数据交互功能。下面以此介绍opencv、matlab读写txt文本的方法。

本文介绍的方法均是搜集于互联网。opencv对txt文本的读写方法,依据以下网址改进而得

http://blog.csdn.net/chenyusiyuan/article/details/7974378

matlab对txt文本的读写方法依据以下网址改进而得

http://blog.csdn.net/fengfuhui/article/details/7651840

1. opencv读写txt文本

1.1 opencv读txt文本数据到Mat矩阵中。

下面是实现该功能的C++代码,在源代码的基础上,本文将其改编为模板函数,这样可以应对多种数据类型。

    template <typename dtype>
int loadData(string fileName, Mat& matData, int matChns, int matRows, int matCols)
{
    int retVal = 0;

    // 打开文件
    ifstream inFile(fileName.c_str(), ios_base::in);
    if(!inFile.is_open())
    {
        cout << "读取文件失败" << endl;
        retVal = -1;
        return (retVal);
    }

    // 载入数据
    istream_iterator<dtype> begin(inFile);    //按 float 格式取文件数据流的起始指针
    istream_iterator<dtype> end;            //取文件流的终止位置
    vector<dtype> inData(begin,end);        //将文件数据保存至 std::vector 中
    Mat tmpMat = Mat(inData);        //将数据由 std::vector 转换为 cv::Mat

    // 输出到命令行窗口
    //copy(vec.begin(),vec.end(),ostream_iterator<double>(cout,"\t"));

    // 检查设定的矩阵尺寸和通道数
    size_t dataLength = inData.size();
    //1.通道数
    if (matChns == 0) 
    {
        matChns = 1;
    }
    //2.行列数
    if (matRows != 0 && matCols == 0) 
    {
        matCols = dataLength / matChns / matRows;
    }
    else if (matCols != 0 && matRows == 0) 
    {
        matRows = dataLength / matChns / matCols;
    }
    else if (matCols == 0 && matRows == 0) 
    {
        matRows = dataLength / matChns;
        matCols = 1;
    }
    //3.数据总长度
    if (dataLength != (matRows * matCols * matChns))
    {
        cout << "读入的数据长度 不满足 设定的矩阵尺寸与通道数要求,将按默认方式输出矩阵!" << endl;
        retVal = 1;
        matChns = 1;
        matRows = dataLength;
    }

    // 将文件数据保存至输出矩阵
    matData = tmpMat.reshape(matChns, matRows).clone();

    return (retVal);
}

例如读取通道为1,行列均为10的数据,并保存到矩阵mat中,该数据以ASCII码的保存在"data.txt"文本文件中。函数调用方式如下:

loadData<float>("data.txt", mat, 1, 10, 10);

1.2 opencv保存Mat矩阵到txt文本中

下面是实现该功能的C++代码,同样以模板函数的方式实现。

    template <typename dtype>
int writeData(string fileName, Mat& matData)
{
    int retVal = 0;

    // 检查矩阵是否为空
    if (matData.empty())
    {
        cout << "矩阵为空" << endl;
        retVal = 1;
        return (retVal);
    }

    // 打开文件
    ofstream outFile(fileName.c_str(), ios_base::out);    //按新建或覆盖方式写入
    if (!outFile.is_open())
    {
        cout << "打开文件失败" << endl;
        retVal = -1;
        return (retVal);
    }

    // 写入数据
    for (int r = 0; r < matData.rows; r++)
    {
        for (int c = 0; c < matData.cols; c++)
        {
            dtype data = matData.at<dtype>(r,c);    //读取数据,at<type> - type 是矩阵元素的具体数据格式
            outFile << data << "\t" ;    //每列数据用 tab 隔开
        }
        outFile << endl;    //换行
    }

    return (retVal);
}

例如保存mat矩阵到“data.txt" 文本函数调用如下

writeData("data.txt", mat);

2 matlab 读写txt文本

2.1 matlab读txt文本保存到相应变量中

实现该功能的matab命令如下

load -ascii filename

读取”data.txt"文本的命令如下,并将读取的数据保存在data变量中

load -ascii ‘data.txt’

2.2 matlab写txt文本

matlab写txt文本命令如下

dlmwrite('filename', M, 'D')

M是需要保存的变量, D是隔开数据的符号,可以是空格、逗号等。这里使用空格便于利用C++对txt文件进行处理。

例如保存mat变量到"data.txt" 文件中,并以空格隔开数据,其命令如下

dlmwrite('data.txt', mat, ' ')



  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值