在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把数据写到文件里,用matlab读出来,然后用matlab各种高级功能查看数据的值。

1、将Mat的数据写入指定文件

为了方便拿来主义者,我直接把这个函数贴出来,你只要把代码拷贝到自己的代码里,就可以直接用了。如果有问题,赶紧评论,我会尽快看看问题出在哪里。

#include <iostream>
#include <fstream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int abWrite(const Mat &im, const string &fname)
{
  ofstream ouF;
  ouF.open(fname.c_str(), std::ofstream::binary);
  if (!ouF)
  {
    cerr << "failed to open the file : " << fname << endl;
    return 0;
  }
  for (int r = 0; r < im.rows; r++)
  {
    ouF.write(reinterpret_cast<const char*>(im.ptr(r)), im.cols*im.elemSize());
  }
  ouF.close();
  return 1;
}

2、用matlab读出二进制文件中的数据

在用matlab来读数据的时候,你必须知道Mat的宽度,高度,通道数,单个通道元素的类型!

以三通道,UCHAR为例,读取数据,显示数据。

C++程序,用于调用abWrite函数。

Mat orgIm = imread("im.jpeg");
abWrite(orgIm, "./orgIm_8UC3.dat");

Matlab程序,读出orgIm_8UC3.dat的数据,并调整为RGB数据显示。

width  = 321; % 这个地方你要指定为你自己的矩阵的宽度
height = 481; % 这里也要指定为你自己的矩阵的高度
channels = 3; % 通道数
fs = fopen('orgIm_8UC3.dat', 'rb');
db = fread(fs, 'uint8'); % 注意,这里用的是unsigned int8
fclose(fs);

ou = reshape(db, channels*height, width); % 调整显示格式

im(:,:,1) = ou(3:3:end, :)'; % R通道
im(:,:,2) = ou(2:3:end, :)'; % G通道
im(:,:,3) = ou(1:3:end, :)'; % B通道
figure; imshow(uint8(im)) % 一定要记得转换为uint8

我的用的测试图像:

执行matlab后的显示图像:

这个实验说明,abWrite很大可能是没有问题的,如果你愿意测试,赶紧写个代码测试下吧。测试有问题,欢迎评论,我会尽快解决。

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

  1. opencv中Mat类型数据操作与遍历

    Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...

  2. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  3. opencv中mat类介绍

    The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It ...

  4. OpenCV中Mat操作clone() 与copyto()的区别

    OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...

  5. OpenCV中Mat的属性

    OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...

  6. OpenCV中Mat的基本用法:创建、复制

    OpenCV中Mat的基本用法:创建.复制 一.Mat类的创建: 1.方法一: 通过读入一张图像,直接将其转换成Mat对象. Mat image = imread("test.jpg&quo ...

  7. OpenCV中Mat的列向量归一化

    OpenCV中Mat的列向量归一化 http://blog.csdn.net/shaoxiaohu1/article/details/8287528 OpenCV中Mat的列向量归一化 标签: Ope ...

  8. opencv中Mat格式的数据访问.at

    opencv3中图形存储基本为Mat格式,如果我们想获取像素点的灰度值或者RGB值,可以通过image.at<uchar>(i,j)的方式轻松获取. Mat类中的at方法对于获取图像矩阵某 ...

  9. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

随机推荐

  1. 重载运算符“ <<” 和“>>” 运算符

    :" <<  "   "  >>  " 的重载作为友元函数重载,有两种方法:1,把变量作为public,就可以不用友元声明:2,先友元声 ...

  2. ●BZOJ 2329 [HNOI2011]括号修复.cpp

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一 ...

  3. NOIP 2012

    Prob.1 vigenere密码 模拟代码: #include<cstdio> #include<cstring> #include<iostream> usin ...

  4. 17.10.28&29

    28上午 骚猪选讲 28下午 BOZJ 1081 [SCOI2005]超级格雷码 感觉就是一个找规律,然后模拟输出.半天没找到一个比较简便的模拟方法,这份代码是学习网上一位大佬的,很巧妙. 代码: # ...

  5. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  6. [BZOJ]2017省队十连测推广赛1

    听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点 ...

  7. gift 分数规划的最大权闭合子图

    题目大意: N个物品,物品间有M组关系,每个物品有一个ai的代价,满足关系后会得到bi的值 求 max(sigma(bi)/sigma(ai)) 题解: 很明显的最大权闭合子图,只不过需要处理分数. ...

  8. ●BZOJ 3129 [Sdoi2013]方程

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3129 题解: 容斥,扩展Lucas,中国剩余定理 先看看不管限制,只需要每个位置都是正整数时 ...

  9. SpringCloud学习之soa基础

    一.soa简单介绍 1)面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.SOA是解决复杂业务模块,提高扩展性,维护性,可伸缩 ...

  10. c++ 变量的存储类别

    c++的存储类别 首先我们得知道c++的变量存储方式:静态存储和动态存储两种,全局变量使用的是静态存储,函数的形参和局部变量是使用的动态存储. 当然在有的教程中又分为自动存储,静态存储,动态存储.相信 ...