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

在使用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读出

时间: 2024-08-02 02:50:45

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

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

Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针. Opencv中对Mat的复制分为两种, Mat A, C; // creates just the header parts A = imread(argv[1], CV_LO

OpenCv学习笔记(一)----OpenCv中Mat类源码的详细解读(2)

(一)像素存储的方法 1--本节我们讲解如何存储像素,存储像素值,需要指定: 1--颜色空间 2--数据类型 2--其中,颜色空间是指针对一个给定的颜色,如何组合颜色以其编码. 3--最简单的颜色空间是----灰度级空间----只需要处理:黑色和白色,对它们进行组合便可以产生不同程度的灰 色(256灰度级) 4--对于彩色方式---则有更多种类的颜色空间,但不论那种方式,都是把颜色分成:三个或者四个---基元素,通过 组合基元素,就可以产生所有的颜色 1--RGB颜色空间是最常用的一种颜色空间,

OpenCV中Mat的属性

OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是一个类,由两个数据部分组成:矩阵头(包括矩阵尺寸.存储方法.存储地址等信息)和指向数据部分的指针. 矩阵头部分 dims->矩阵的维度 rows->矩阵的行数 cols->矩阵的列数 size->矩阵的大小,size(cols,rows) channels->矩阵元素拥有的通道数

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

opencv3中图形存储基本为Mat格式,如果我们想获取像素点的灰度值或者RGB值,可以通过image.at<uchar>(i,j)的方式轻松获取. Mat类中的at方法对于获取图像矩阵某点的RGB值或者改变某点的值很方便,对于单通道的图像,则可以使用: image.at<uchar>(i, j) 其中有一个要注意的地方是i对应的是点的y坐标,j对应的是点的x坐标,而不是我们习惯的(x,y) 来获取或改变该点的值,而RGB通道的则可以使用: image.at<Vec3b>

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

opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Matlab中的各种矩阵运算),所以将IplImage类型和CvMat类型转换为Mat类型更易于数据处理. Mat类型可用于直接存储图像信息,通过函数imread.imwrite.imshow等实现(与Matlab中的函数相

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

opencv中 Mat矩阵申明形式

在调用opencv的时候,可能不像matlab那样直接就可以 新建矩阵.在C++中需要严格的定义矩阵形式: 在opencv中一共有显示创建Mat对象的方法: 一.使用mat()构造函数: 上图中可以发现,首先要先定义其图像尺寸 (2*3,宽为2  高为3 ).即图像的行数和列数:然后制定存储袁术的数据类型以及每个矩阵点的通道数,是浮点型存储还是字符型,是三通道还是单通道:     例如: CV_8UC3   就是代表的8位 的unsigned char 型 ,每个像素是由三个元素组成的三通道:

OpenCV中Mat与二维数组之间的转换

---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> //包含imread, imshow等标识符 #include "opencv2/imgproc/imgproc.hpp" //包含c

OpenCV中Mat数据的访问报错

最近再写一段程序的时候,要访问Mat中的元素.在定义Mat型数据的时候,用 Mat ObjectPoints(48,3,CV_32FC1,0) 对其进行初始化后,用at进行访问时报内存错误. 1 Mat ObjectPoints(48,3,CV_32FC1); 2 Mat ImgPoints(48,2,CV_32FC1); 3 Mat CameraMatrix(3,3,CV_32FC1); 4 CvMat *intrinsic_matrix; 5 CvMat *ObjPoint; 6 CvMat