Write cv::Mat to a file

简介:

如果我们想把OpenCV中的矩阵数据类型cv::Mat保存在一个文件中,可以使用如下的代码:

void writeMatToFile(cv::Mat& m, const char* filename) {
    ofstream fout(filename);
    if(!fout) {
        cout<<"File Not Opened"<<endl;  return;
    }
    fout << m;
    fout.close();
}

上述代码生成的数据由中括号括起来了,我们如果想导入Matlab做进一步处理的话,最好去掉首尾的中括号,当然,我们可以打开txt,手动删除中括号。如果我们想偷懒,让程序来删除的话,可以使用如下的代码:

void writeMatToFile(cv::Mat& m, const char* filename)
{
    ofstream fout(filename);
    if(!fout) {
        cout<<"File Not Opened"<<endl;  return;
    }
    //fout << m.rows << " " << m.cols << " " << m.dims << endl;
    fout << m;
    fout.close();
    // Delete the begining '[' and ending ']'
    fstream file(filename);
    string line;
    int cnt = 0;
    fout.open("tmp.txt");
    while (!file.eof()) {
        getline(file, line);
        if (cnt == 0) line = line.substr(1); // Delete '['
        if (cnt == m.rows - 1) line.pop_back(); // Delete ']'
        fout << line << endl;
        ++cnt;
    }
    file.close();
    fout.close();
    file.open("tmp.txt");
    fout.open(filename);
    while (!file.eof()) {
        getline(file, line);
        fout << line << endl;
    }
    file.close();
    fout.close();
    system("del tmp.txt");
}

还有一种方法用for循环将每个位置的数据写入文本中,但是这种方法保存下来的值跟上面那种方法稍有些出入,上述方法精度应该更高一些,我也把这种方法列出来作为参考吧:

void writeMatToFile(cv::Mat& m, const char* filename)
{
    ofstream fout(filename);
    if(!fout) {
        cout<<"File Not Opened"<<endl;  return;
    }
    for (int i = 0; i < m.rows; ++i) {
        for (int j = 0; j < m.cols; ++j) {
            for (int k = 0; k < m.channels(); ++k) {
                fout << m.at<float>(i, j * m.channels() + k);
                if (j * m.channels() + k < m.cols * m.channels() - 1) {
                    fout << ", ";
                }
            }
        }
        if (i < m.rows - 1) fout << "; " << endl;
    }
    fout.close();
}

 我们也可以用OpenCV自带的API来完成数据的读和写,我们来看CvMat数据类型的读和写,关于CvMat和cv::Mat之间的转换请猛戳这里

// Save CvMat to .xml file
CvMat *m = cvLoadImageM("image.jpg", CV_LOAD_IMAGE_COLOR);
cvSave("m.yml", m);

// Save cv::Mat to .xml file
cv::Mat m;
CvMat cm = m;
cvSave("cm.yml", &cm);

// Load .xml file to CvMat
CvFileStorage *fs = cvOpenFileStorage("m.yml", 0, CV_STORAGE_READ); 
CvMat *newM = (CvMat*) cvLoad("m.yml");

本文转自博客园Grandyang的博客,原文链接:Write cv::Mat to a file,如需转载请自行联系原博主。

相关文章
|
数据采集 XML 自然语言处理
Python 数据解析:从基础到高级技巧
Python 数据解析:从基础到高级技巧
376 0
|
存储 缓存 监控
安谋科技(Arm China)马闯:Arm架构下性能分析与优化介绍
2023年9月19日,系列课程第九节《Arm®架构下性能分析与优化介绍》正式上线,由安谋科技 (Arm China)主任工程师马闯主讲,内容涵盖:Arm架构下性能监控单元 (PMU) 介绍、Arm统计性能分析扩展 (SPE) 介绍、Arm性能分析工具介绍、Arm架构下性能优化案例分享,本期节目在阿里云官网、阿里云微信视频号、阿里云钉钉视频号、InfoQ官网、阿里云开发者微信视频号、阿里云创新中心直播平台 & 微信视频号同步播出,同时可以点击【https://developer.aliyun.com/topic/ecs-yitian】进入【倚天实例迁移课程官网】了解更多内容。
|
网络安全 数据安全/隐私保护
ssh远程执行命令自动输入密码方式
ssh远程执行命令自动输入密码方式
3188 0
|
机器学习/深度学习 人工智能 算法
【强化学习】强化学习在游戏、决策支持系统以及复杂环境模拟中的应用进展
强化学习(Reinforcement Learning, RL)与游戏理论在多个领域的应用取得了显著进展,特别是在游戏、决策支持系统以及复杂环境模拟中。以下是对这些领域应用进展的详细探讨
341 2
|
XML JSON Java
常用工具类---JSONUtil
这段内容提供了Java中将不同数据结构转换为JSON的代码示例。包括使用`JSONArray`将一维和二维数组、对象、Map及List转换为JSON字符串,并展示了如何从JSON字符串转换回Object、List以及XML到JSON的转换。
|
存储 前端开发 安全
【面试题】: bs架构与cs架构的区别以及各自优缺点
bs架构与cs架构的区别以及各自优缺点
5875 0
|
自然语言处理 搜索推荐 机器人
大语言模型及其应用场景
大语言模型(如通义千问)凭借强大的自然语言处理能力,在内容创作、对话系统、翻译、信息抽取、代码生成、智能搜索、教育、企业管理和法律等领域展现巨大潜力,助力提升各行业智能化水平。
2166 0
|
存储 NoSQL 分布式数据库
数据库的演进之路:从传统到现代,技术的飞跃与应用
一、引言 数据库作为数据存储和管理的核心工具,随着信息技术的快速发展,经历了从简单到复杂、从单机到分布式的演进过程
|
存储 NoSQL 数据库
使用知识图谱提高RAG的能力,减少大模型幻觉
在使用大型语言模型(llm)时,幻觉是一个常见的问题。LLM生成流畅连贯的文本,但往往生成不准确或不一致的信息。防止LLM产生幻觉的方法之一是使用提供事实信息的外部知识来源,如数据库或知识图谱。
512 5
|
传感器 存储 缓存