C++读写mat文件方法
- 格式:docx
- 大小:20.18 KB
- 文档页数:2
opencv mat 用法OpenCV是一个广泛使用的计算机视觉库,它提供了许多功能和工具,用于图像处理、视频处理、特征提取等任务。
在OpenCV中,Mat 是一个非常重要的数据结构,用于存储和操作图像数据。
在本篇文章中,我们将介绍Mat的基本用法,包括创建、读取、写入和操作图像数据。
一、Mat的创建在使用Mat之前,需要先创建它。
OpenCV提供了多种方法来创建Mat对象,可以根据需要选择合适的方法。
常用的创建Mat的方法包括:1.使用zeros()或ones()函数创建指定尺寸的零矩阵或全矩阵。
2.使用imread()函数从文件中加载图像,并将其存储为Mat对象。
3.使用随机数生成器创建具有一定分布的图像数据。
下面是一个简单的示例代码,演示如何使用imread()函数创建Mat对象:```pythonimportcv2#读取图像并创建Mat对象img=cv2.imread('image.jpg')#显示图像cv2.imshow('Image',img)cv2.waitKey(0)```二、Mat的读取和写入使用imread()函数可以从文件中加载图像数据并将其存储为Mat 对象。
同样地,使用imwrite()函数可以将Mat对象中的数据写入文件。
下面是一个简单的示例代码,演示如何使用imwrite()函数将Mat 对象中的数据写入文件:```pythonimportcv2importnumpyasnp#创建一个随机图像数据data=np.random.randint(0,256,(500,500,3),dtype=np.uint8) #创建Mat对象并设置数据mat=cv2.Mat(500,500,CV_8UC3,data)#显示Mat对象的内容cv2.imshow('Mat',mat)cv2.waitKey(0)#将Mat对象写入文件cv2.imwrite('output.jpg',mat)```三、Mat的数据类型和尺寸Mat对象可以存储不同类型的数据,包括单通道和多通道数据。
关于VC环境中调用Matlab程序的说明1Matlab m文件的编译在VC环境中调用Matlab程序有多种途径,现在采用的是由Matlab程序直接将m文件编译成可供C++调用的动态链接库文件,使用的Matlab命令是:mcc -t -W lib:libfilename -T link:lib filename其中libfilename是编译得到的动态链接库的文件名,filename是m文件的文件名,m 文件必须是函数形式。
命令执行后得到libfilename.lib、libfilename.dll、libfilename.h文件。
Matlab的一些内建函数并不被编译命令识别,因此需要显式的将这些函数名写入编译命令。
2VC++环境下调用Matlab动态链接库2.1 载入Matlab动态链接库VC中调用Matlab动态链接库需要将filename.lib和filename.h载入VC工程中,并且需要载入Matlab的两个库文件:libmatlb.lib和libmx.lib。
载入方法可以显式的载入,也可以直接将文件加入工程:显式的载入:首先将Matlab库文件的保存地址载入VC框架,Tools->Options->Directories……;然后显式的将需要的库文件载入:#pragma comment (lib,“name.lib“)。
直接加入文件:Project->Add to project->files……。
2.2 VC++环境下调试Matlab程序在VC 中,所有和Matlab 的数据交互都是通过mxArray 来实现的。
Matlab编译得到的动态链接库中,接口函数返回类型就是mxArray型的。
在使用mxArray 类型的程序中,应包含头文件matrix.h。
但是在Matlab编译得到的头文件libfilename.h中,包含了头文件libmatlab.h,该头文件又包含了matrix.h,因此,只要在工程中包含进libfilename.h就可以了。
c++读写文件的几种方法
1.使用fstream库:可以通过fstream库中的fstream类实现文件的读写操作。
它提供了读写文件的基本操作,如打开文件、读取文件内容和写入数据等。
2. 使用cstdio库:可以使用C语言中的stdio.h头文件提供的函数,如fopen、fread和fwrite等实现文件的读写操作。
它适用于C和C++语言。
3. 使用iostream库:可以使用C++中的iostream头文件提供的类,如iostream、ifstream和ofstream等实现文件的读写操作。
这是一种比较简单且方便的文件读写方法。
4. 使用boost库:Boost库是一个流行的C++库,它提供了许多有用的函数和类来处理文件读写操作。
通过使用boost库,可以高效地读取和写入文件,提高文件操作的性能和效率。
5. 使用Qt库:Qt库是一个跨平台的C++库,它提供了大量的类和函数来处理文件的读写操作。
Qt库的优点是它可以直接读取和写入不同类型的文件,如文本文件、二进制文件和XML文件等。
- 1 -。
在OpenCV中,Mat是一个重要的数据结构,用于存储图像和其他类型的矩阵数据。
你可以使用以下几种方式声明一个Mat对象:
1. 声明一个空的Mat:
```cpp
cv::Mat mat;
```
2. 声明并初始化一个指定大小和类型的Mat:
```cpp
cv::Mat mat(rows, cols, type);
```
在这里,`rows`和`cols`是矩阵的行数和列数,`type`是矩阵的数据类型。
例如,你可以使用`CV_32F`表示32位浮点型。
3. 声明并初始化一个单通道的8位无符号整型矩阵:
```cpp
cv::Mat mat = cv::Mat::ones(rows, cols, CV_8U);
```
4. 从已有的数据中声明并初始化一个Mat:
```cpp
cv::Mat mat(rows, cols, CV_8UC3, Scalar(0,0,255));
```
在这里,`CV_8UC3`表示8位无符号整型且有3个通道的矩阵。
`Scalar(0,0,255)`为每个通道设置了一个初始值。
5. 从另一个Mat对象中声明并初始化一个Mat:
```cpp
cv::Mat mat1 = ...; // Some existing Mat object.
cv::Mat mat2 = mat1.clone(); // Create a clone of mat1.
```
以上就是一些基本的Mat声明方式。
在实际使用中,你需要根据具体的需求来选择合适的方式来声明和初始化你的Mat对象。
C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。
本文就对如何在C程序中调用Matlab程序作说明。
在C程序中调用Matlab程序有两大类方法。
第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。
前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。
关于MCR,请见第四章的说明。
至于两种方法需要在C环境中如何配置请见第五章。
而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。
一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。
下面是调用Matlab中的加法程序add.m的例子。
先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。
使用C++语言读取*.mat文件中的数据简介:借助于Matlab的接口函数,在Visual Studio中使用C++语言读取*.mat文件中的数据(这里主要是2维矩阵(灰度图像)和3维矩阵(彩色图像))到OpenCV 中的Mat数据结构中并显示图像,同时实现将灰度图像转化为伪彩色图像(类型为Matlab中的colormap jet),最后调用Windows的API函数实现窗口尺寸的自由调整。
工具:(1)Matlab R2015b(x64) (2)Visual Studio 2013 (3)OpenCV 3.0.0一、在Visual Studio配置Matlab和OpenCV假设Matlab的安装路径为“E:\Program Files\MATLAB”,OpenCV的安装路径为“E:\Program Files\opencv”。
1.配置环境变量在“控制面板》系统和安全》系统》高级系统设置》环境变量》系统变量”中找到变量名“Path”,编辑之,在变量值的末尾添加“;E:\Program Files\MATLAB\R2015b\bin\win64;E:\Program Files\opencv\build\x64\vc12\bin”。
如图1所示。
图12.配置配置管理器在Visual Studio 2013中新建一个“Win32控制台应用程序”,在菜单栏“生成”中打开“配置管理器”选项。
将“活动解决方案平台”中的“Win32”选为(新建为)“x64”。
如图2所示。
图23.配置属性管理器在菜单栏“视图”中打开“属性管理器”选项,右键点击Debug|x64下的er并打开“属性”选项,如图3所示。
在“er属性页”中找到“通用属性”下的“VC++目录”,在其右侧的“包含目录”下添加路径“E:\Program Files\opencv\build\include”“E:\Program Files\opencv\build\include\opencv”“E:\Program Files\opencv\build\include\opencv2”“E:\Program Files\MATLAB\R2015b\extern\include”“E:\Program Files\MATLAB\R2015b\extern\include\win64”一共5个路径。
C、C++和MFC中文件的读写方法对文件读写的三种方法1.C中FILE *pFile=fopen("1.txt","w");fwrite("",1,strlen(""),pFile");//fseek(pFile,0,SEEK_SET);//fwrite("ftp:",1,strlen("ftp:"),pFile);//fwrite("",1,strlen(""),pFile");fclose(pFile);*///fflush(pFile);表头文件 #include<stdio.h>获取文件长度的方法:FILE *fp = fopen(filePath, "r");fseek(fp, 0, SEEK_END);//先移动到文件结尾处n = ftell(fp);fclose(fp);各个函数说明:FILE * fopen(const char * path,const char * mode);函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:int fseek( FILE *stream, long offset, int origin );第一个参数stream为文件指针第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SETSEEK_CUR:当前位置SEEK_END:文件结尾SEEK_SET:文件开头其中SEEK_CUR,SEEK_END和SEEK_SET依次为1,2和0int fwrite(buffer,size,count,fp);(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。
OpenCVcv.Mat与.txt⽂件数据的读写操作本篇⽂章主要介绍了OpenCV cv.Mat 与 .txt ⽂件数据的读写操作,⼩编觉得挺不错的,现在分享给⼤家。
1、按OpenCV格式实现的 .txt ⽂件读写可以⽤ cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专⽤与 OpenCV 的数据读写,还是⽤ .xml/.yml ⽂件格式较好,我⽐较喜欢 .yml 格式,可读性⾮常棒。
⽤ cvSave 和 cvLoad 读写 .txt ⽂件,其实现⽅式和数据格式与 .yml ⽂件基本⼀致。
例如:cvSave("camera_matrix.txt",camera_matrix); //保存了 camera_matrix 的数组头以及和它所指的data(类似yml形式的⽂件)2、导⼊/导出其它程序的 .txt ⽂件数据可以⽤常规的 sprintf_s 和 fprintf_s 来实现,不过效率⽐较低,这⾥介绍⼀种快捷易⽤的⽅法,利⽤了 std 的 steam 和vector。
#include <iostream>#include <fstream>#include <iterator>#include <vector>using namespace std;/*----------------------------* 功能 : 将 cv::Mat 数据写⼊到 .txt ⽂件*----------------------------* 函数 : WriteData* 访问 : public* 返回 : -1:打开⽂件失败;0:写⼊数据成功;1:矩阵为空** 参数 : fileName [in] ⽂件名* 参数 : matData [in] 矩阵数据*/int WriteData(string fileName, cv::Mat& matData){int retVal = 0;// 打开⽂件ofstream outFile(fileName.c_str(), ios_base::out); //按新建或覆盖⽅式写⼊if (!outFile.is_open()){cout << "打开⽂件失败" << endl;retVal = -1;return (retVal);}// 检查矩阵是否为空if (matData.empty()){cout << "矩阵为空" << endl;retVal = 1;return (retVal);}// 写⼊数据for (int r = 0; r < matData.rows; r++){for (int c = 0; c < matData.cols; c++){uchar data = matData.at<uchar>(r,c); //读取数据,at<type> - type 是矩阵元素的具体数据格式outFile << data << "\t" ; //每列数据⽤ tab 隔开}outFile << endl; //换⾏}return (retVal);}/*----------------------------* 功能 : 从 .txt ⽂件中读⼊数据,保存到 cv::Mat 矩阵* - 默认按 float 格式读⼊数据,* - 如果没有指定矩阵的⾏、列和通道数,则输出的矩阵是单通道、N ⾏ 1 列的*----------------------------* 函数 : LoadData* 访问 : public* 返回 : -1:打开⽂件失败;0:按设定的矩阵参数读取数据成功;1:按默认的矩阵参数读取数据** 参数 : fileName [in] ⽂件名* 参数 : matData [out] 矩阵数据* 参数 : matRows [in] 矩阵⾏数,默认为 0* 参数 : matCols [in] 矩阵列数,默认为 0* 参数 : matChns [in] 矩阵通道数,默认为 0*/int LoadData(string fileName, cv::Mat& matData, int matRows = 0, int matCols = 0, int matChns = 0) {int retVal = 0;// 打开⽂件ifstream inFile(fileName.c_str(), ios_base::in);if(!inFile.is_open()){cout << "读取⽂件失败" << endl;retVal = -1;return (retVal);}// 载⼊数据istream_iterator<float> begin(inFile); //按 float 格式取⽂件数据流的起始指针istream_iterator<float> end; //取⽂件流的终⽌位置vector<float> inData(begin,end); //将⽂件数据保存⾄ std::vector 中cv::Mat tmpMat = cv::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);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
MAT 文件使用技巧MAT 文件MAT文件是M ATLA B使用的一种特有的二进制数据文件。
MAT文件可以包含一个或者多个M A TLAB变量。
MATLAB通常采用M A T文件把工作空间的变量存储在磁盘里,在MAT文件中不仅保存各变量数据本身,而且同时保存变量名以及数据类型等。
所以在MAT LAB中载入某个MA T文件后,可以在当前M A TLAB工作空间完全再现当初保存该MA T 文件时的那些变量。
这是其他文件格式所不能的。
同样,用户也可以使用MAT文件从MAT LAB环境中导出数据。
MAT文件提供了一种更简便的机制在不同操作平台之间移动MATL AB数据。
2.5.1 在MATLA B中读写M AT文件在MATLA B环境中,通常使用lo ad和sa ve两个命令进行 MAT 文件的读和写。
在默认情况下,这两个命令以MAT 文件格式处理文件,但是也可以用–ascii参数选项来强制用文件方式处理文件。
关于这点已经在本章介绍过了,这里主要介绍如何读写M A T文件。
1. load 函数的使用load函数可以从MA T文件中读取数据,例如要读取m y mat.dat文件,可以直接执行命令loa d mymat.dat,因为给出要读取的文件的后缀名是M A T,因此命令则以MAT文件格式读取数据,否则将以文本文件读取数据。
命令中的文件名可以包含单引号,也可以不包含,也就是说该函数也可以这样调用:load 'mymat.m at' 。
load 函数还可以指定只读取文件中的某几个变量,只需在文件名之后列出想要读取的变量的变量名就可以了,变量名也可以使用通配符。
比如命令lo ad mymat.mat y*,执行结果就是将文件中所有以y开头的变量读取出来。
c++ 调用matlab 读写文件函数
本文主要研究c++调用matlab读写文件函数的实现原理,具体的实现过程中需要考虑到文件的读写顺序、文件的路径、文件类型等多种因素,本文通过分析和实验,介绍c++调用matlab读写文件函数的原理和函数用法。
1.2 c++调用matlab读写文件
实现c++调用matlab函数读写文件的基本原理是通过Matlab C APIs(Application Programming Interfaces)实现的,其中最基本的函数就是mxCreateMatrix ,可以用来读取数据和存储数据,而最重要的一步就是打开文件和关闭文件,具体操作如下:
(1)void *mxCreateMatrix(char* FileName,int nrow,int ncol)
该函数可以读取指定文件中nrow×ncol的数据,文件名为FileName,如果成功读取数据,则返回void*指针,如果失败,则返回NULL。
也可以用来存储数据,这时候nrow和ncol分别对应要写入的行列数。
(2)int mxCreateFile(char* FileName)
该函数会打开指定的文件,并返回一个文件句柄,如果文件打开失败则返回-1;
(3)int mxCloseFile(int fileHandle)
该函数会关闭指定文件,参数为文件句柄,如果文件关闭失败则返回-1。
C++读写.mat文件
分类:C/C++ 2012-11-21 10:50 2040人阅读评论(0) 收藏举报
最近在编写C++程序的过程中,需要使用matlab生成的.mat文件,于是查找了基本使用方法。
我的计算机环境是win7 64位系统,VS2010,matlab R2010b。
一、工程配置:
1.C/C++->常规->附加包含目录添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
2.链接器->常规->附加库目录添加:
MATLAB\R2010b\extern\lib\win64\microsoft
MATLAB\R2010b\extern\lib\win32\microsoft
3.链接器->输入->附加依赖库添加:
libmat.lib
libmx.lib
libmex.lib
libeng.lib
由于所安装的matlab为64位,要调用其函数,需要将工程转换为X64
4.顶菜单->生成->配置管理器->平台:X64
5.链接器->高级->目标计算机:
MachineX64(/MACHINE:X64)
6.计算机环境变量->path 添加:
E:\DevTools\MATLAB\R2010b\extern\lib\win64\microsoft;
E:\DevTools\MATLAB\R2010b\bin\win64;
二、所用到的基本读取写入mat文件代码示例:
首先需要包含头文件:
#include <mat.h>
[cpp] view plaincopy
MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;
// 读取.mat文件(例:mat文件名为"initUrban.mat",其中包含"initA")
double *initA;
pmatFile = matOpen("initUrban.mat","r");
pMxArray = matGetVariable(pmatFile, "initA");
initA = (double*) mxGetData(pMxArray);
M = mxGetM(pMxArray);
N = mxGetN(pMxArray);
Matrix<double> A(M,N);
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
A[i][j] = initA[M*j+i];
matClose(pmatFile);
mxFree(initA);
// 生成.mat文件
double *outA = new double[M*N];
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
outA[M*j+i] = A[i][j];
pmatFile = matOpen("A.mat","w");
pMxArray = mxCreateDoubleMatrix(M, N, mxREAL);
mxSetData(pMxArray, outA);
matPutVariable(pmatFile, "A", pMxArray);
matClose(pmatFile);
三、程序说明
1.使用matOpen函数打开mat文件
MATFile *matOpen(const char *filename,const char *mode)
mode:
r:以只读方式打开
u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
w:以写入方式打开,只能写如入,如果要打开的数据文件不存在,则创建一个新的文件2.使用matGetVariable函数读取mat文件中的变量
mxArray * matGetVariable(MATFile * pMF, const char * name);
读取名为name的变量,返回一个数据阵列指针
3.使用mxGetData函数获取数据阵列中的数据
void *mxGetData(const mxArray *pa );
返回时需要使用强制类型转换。
4.使用mxGetM和mxGetN函数获取数据阵列矩阵的维数
size_t mxGetM(const mxArray *pa);
size_t mxGetN(const mxArray *pa);
5.使用mxCreateDoubleMatrix函数创建数据阵列为双浮点数矩阵
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity flag);
6.使用mxSetData函数将变量存入数据阵列
void mxSetData( mxArray *pa, void *newdata );
7.使用matPutVariable函数将数据阵列存入到mat文件中
int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);
存入成功返回0,存入出错返回非0
8.由于malab中矩阵的存储是按列存储,与c中不同,所以从mat文件中获取的矩阵需要重新排列。
生成mat文件时,同样要注意。
9.完成mat文件操作后需要调用matClose函数关闭文件,并使用mxFree释放内存。