如果我们想把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 = ;
fout.open("tmp.txt");
while (!file.eof()) {
getline(file, line);
if (cnt == ) line = line.substr(); // Delete '['
if (cnt == m.rows - ) 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 = ; i < m.rows; ++i) {
for (int j = ; j < m.cols; ++j) {
for (int k = ; k < m.channels(); ++k) {
fout << m.at<float>(i, j * m.channels() + k);
if (j * m.channels() + k < m.cols * m.channels() - ) {
fout << ", ";
}
}
}
if (i < m.rows - ) 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", , CV_STORAGE_READ);
CvMat *newM = (CvMat*) cvLoad("m.yml");

Write cv::Mat to a file的更多相关文章

  1. MatLab Load cv::Mat 导入数据

    我们有时候在项目中需要将OpenCV中的cv::Mat导入MatLab进行分析与处理,那么如果把数据转过去呢,我们的做法是首先将cv::Mat导出为txt文件,或者是yml文件,请参见我之前的博客Wr ...

  2. [opencvjichu]cv::Mat::type() 返回值

    opencv opencv中Mat存在各种类型,其中mat有一个type()的函数可以返回该Mat的类型.类型表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位 ...

  3. cv::Mat到YUV420的转换《转》

    某些特定场合我们会经常遇到yuv420格式的视频文件,这种视频帧无法直接用于opencv,故而,需要进行格式转换:幸运的是,opencv提供了rgb到yuv420的格式转换函数:下面给出基本用法: 函 ...

  4. 访问cv::Mat中的数据时遇到的指针类型问题

    在用Opencv的时候由于下图原本的图像尺寸是1111*1111,要进行resize,代码如下: cv::Mat img = cv::imread("//Users//apple//td3/ ...

  5. OpenCV 3.0 CvMat and cv::Mat Conversion

    After OpenCV 3.0, CvMat cannot be directly converted to cv::Mat, we need to use function cvarrToMat( ...

  6. Convert between cv::Mat and QImage 两种图片类转换

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  7. CvMat and cv::Mat

    CvMat: typedef struct CvMat { int type; int step; /* for internal use only */ int* refcount; int hdr ...

  8. cv::mat转换成QImage的问题

    在进行cv::mat转换为QImage过程中,经常出现问题: cv::Mat image; ...QImage img=QImage((const unsigned char*)(image.data ...

  9. OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

随机推荐

  1. 在cmd命令行中弹出Windows对话框

    有时候用bat写一些小脚本最后会弹出对话框提示操作成功,可以用mshta.exe来实现,它是Windows系统的相关程序,用来执行.HTA文件,一般计算机上面都有这个程序,实现如下: mshta vb ...

  2. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  3. WPF 打印控件 无弹框打印。

    WPF中打印用到了 PrintDialog类. 其中设置打印属性的是PrintTicket,管理打印机的是PrintQueue. 实例如下: public class PrintDialogHelpe ...

  4. Java for LeetCode 067 Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  5. Java for LeetCode 054 Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  6. BestCoder11(Div2) 1003 Boring count (hdu 5056) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5056 题目意思:给出一条只有小写字母组成的序列S,问当中可以组成多少条每个字母出现的次数 <= ...

  7. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  8. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  9. Scala入门

    搭建环境请参考: http://www.cnblogs.com/super-d2/p/4534208.html 1.交互式编程: adeMacBook-Pro:ssdb-master apple$ s ...

  10. 关于setTimeout的妙用前端函数节流

    最近在某团队忙于一个项目,有这么一个页面,采用传统模式开发(吐槽它为什么不用React),它的DOM操作比较多,然后性能是比较差的,尤其当你缩放窗口时,可怕的事情发生了,出现了卡顿,甚至浏览器瘫痪.为 ...