Opencv文件操作与数据存储

合集下载

c++的opencv使用方法总结

c++的opencv使用方法总结

C++的OpenCV使用方法总结在计算机视觉和图像处理领域,OpenCV是一个非常强大的开源库,它提供了丰富的功能和工具,用于处理图像和视频。

作为C++程序员,了解并熟练使用OpenCV库是非常重要的。

本文将对C++中使用OpenCV的方法进行总结,并探讨一些常见的应用和技巧。

一、安装和配置OpenCV在开始使用OpenCV之前,首先需要安装和配置这个库。

在Windows评台上,可以通过下载预编译的二进制文件进行安装;在Linux评台上,可以通过包管理器进行安装。

安装完毕后,还需进行一些环境配置,确保编译器能够正确信息OpenCV库文件。

二、基本图像处理1. 读取和显示图像在C++中使用OpenCV读取和显示图像非常简单,只需几行代码即可完成。

首先需要使用imread函数读取图像文件,然后使用imshow 函数显示图像。

在进行图像显示后,需要使用waitKey函数等待用户按下某个键,以便关闭显示窗口。

2. 图像的基本操作OpenCV提供了丰富的图像处理函数,包括图像缩放、旋转、平移、通道拆分与合并等。

这些函数可以帮助我们对图像进行各种基本操作,从而满足不同的需求。

三、特征提取与描述1. Harris角点检测Harris角点检测是一种经典的特征点检测方法,它可以用来识别图像中的角点。

在OpenCV中,我们可以使用cornerHarris函数来实现Harris角点检测,然后对检测结果进行筛选和标记。

2. SIFT特征提取SIFT是一种广泛应用的特征提取算法,它具有旋转不变性和尺度不变性。

在OpenCV中,我们可以使用SIFT算法来提取图像的关键点和特征描述子,从而实现图像匹配和目标识别等功能。

四、图像分类与识别1. 使用支持向量机(SVM)进行图像分类OpenCV提供了对机器学习算法的支持,包括SVM分类器。

我们可以使用SVM对图像进行分类,从而实现图像识别和目标检测等功能。

2. 使用深度学习模型进行图像识别近年来,深度学习在图像识别领域取得了显著的成就。

OpenCV FileStorage类读写XML或YML文件

OpenCV FileStorage类读写XML或YML文件

OpenCV FileStorage类读写XML/YML文件在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。

在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节。

新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要以图像格式。

当需要保存浮点数据或者XML/YML文件时,之前的C语言接口cvSave()函数已经在C++接口中被删除,代替它的是FileStorage类。

这个类非常的方便,封装了很多数据结构的细节,编程的时候可以根据统一的接口对数据结构进行保存。

1. FileStorage类写XML/YML文件•新建一个FileStorage对象,以FileStorage::WRITE的方式打开一个文件。

•使用<< 操作对该文件进行操作。

•释放该对象,对文件进行关闭。

例子如下:FileStorage fs("test.yml", FileStorage::WRITE);fs << "frameCount" << 5;time_t rawtime; time(&rawtime);fs << "calibrationDate" << asctime(localtime(&rawtime));Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); //又一种Mat初始化方式Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0);fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;//features为一个大小为3的向量,其中每个元素由随机数x,y和大小为8的uchar数组组成fs << "features" << "[";for( int i = 0; i < 3; i++ ){int x = rand() % 640;int y = rand() % 480;uchar lbp = rand() % 256;fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";for( int j = 0; j < 8; j++ )fs << ((lbp >> j) & 1);fs << "]" << "}";}fs << "]";fs.release();2. FileStorage类读XML/YML文件FileStorage对存储内容在内存中是以层次的节点组成的,每个节点类型为FileNode,FileNode可以使单个的数值、数组或者一系列FileNode的集合。

OpenCV简介

OpenCV简介

基本的数据结构
1.图像结构 2.矩阵的与向量结构 3.其他的数据结构 (1)点的表示 (2)长方形维数的表示 (3)有偏移量的长方形表示

中国.中学政治教学网崇尚互联共享
图像结构
Opencv中的所有图像都采用同一个结构 IplImage,该图像结构说明参考后面的 PPT。实际上, IplImage是借鉴于Intel 公司最早发布的IPP图像处理开发包中 的定义;但由于IPP并非开源项目,因 此对于OpenCV基本采用这个较复杂的 图像结构,其版权方面的问题还有待 研究。

中国.中学政治教学网崇尚互联共享
OpenCV基础
1.OpenCV命名规则 2.基本数据结构 3.矩阵的使用与操作 4.图象的使用与操作 5.数据结构与数据操作

中国.中学政治教学网崇尚互联共享
OpenCV命名规则
中国.中学政治教学网崇尚互联共享
学习资源
目前,OpenCV方面的资源已经很多,当然最简单的方法还是在网上搜索, 比如在Google搜索引擎() 中输入”OpenCV”即可进行相关查找,这里给出一些信息作为参考。 (1)参考手册 英文 请打开文件<opencv-root>/docs/index.htm进行查询。 中文 请打开网页/进行查阅。 (2)网络资源 官方网站 网址是/technology/computing/opencv/。 中文官方网站 网址是/。 软件下载 网址是/projects/opencvlibrary/。 (3)书籍 请阅读北京航空航天大学出版社出版的《OpenCV教程》。
1.函数命名规则
通用函数名为 cvActionTargetMod(…) 其中,Action表示核心函数(比如:Set,Create); Target表示目标图像区域(比如:轮廓,多边形); Mod表示可选变种(比如:变量类型)。

opencv函数

opencv函数

imread 读图namedWindow 产生一个被命名的窗口imshow 显示图像using namespace 全局的命名空间,可以避免导致全局命名冲突问题。

cv表示opencv的命名空间std是标准输入输出的命名空间waitKey 程序运行等待时间ms为单位#include<opencv2/highgui/highgui.hpp> 包含输入输出操作#include<iostream> VC的标准输入输出cout << 输出cin>> 输入均以endl结尾#include<string> 字符串库cvtColor 彩色图像变灰度图像imwrite 写出图像F9设置断点F5调试运行后点击变量中的+显示数据结构argv[1]的定位方式为:在工程属性中,命令行参数添加路径,例如:#include<opencv2/core/core.hpp> 定义的基本构建块库Mat 基本图像容器,是一个矩阵类。

用法:Mat A; //定义矩阵Mat B(A);//复制A矩阵数据给BMat D(A,Rect(10, 10, 100, 100)); //将A矩阵的一个区域给DMat F = A.clone();//复制A矩阵数据给FMat M(2,2,CV_8UC3,Scalar(0,0,255));//创建一个矩阵,2×2大小,数据结构为CV_[每个数据占用BIT][Signed or Unsigned][Type Prefix]C[取前几个数或书写几遍] Scalar数据向量。

Signed有符号:8位数据范围为:-128~127Unsigned无符号:8位数据范围为:0~255Mat::eye(4, 4,CV_64F) //单位矩阵Mat::ones(2, 2,CV_32F) //全1矩阵Mat::zeros(3,3,CV_8UC1) //全0矩阵Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//常规矩阵定义randu(R,Scalar::all(0),Scalar::all(255));//任意矩阵的生成Point2f P(5, 1);//定义二维点Point3f P3f(2, 6, 7); //定义三维点vector<float> v;//定义浮点数向量vector<Point2f> vPoints(20);//定义点坐标(二维数据)向量uchar就是uint8加注const 不能改变参数值;sizeof 读取大小I.channels(); //图像维数I.rows; //图像的行数I.cols;//图像的列数I.depth();//图像的深度对于图像的点式处理:uchar* p;//定义一个uint8图像for(i = 0;i < nRows; ++i){p = I.ptr<uchar>(i); //将每一行的向量赋给pfor (j = 0;j < nCols; ++j){p[j] = table[p[j]];//对每一行的向量,每一列的元素进行赋值,table是变换好的数组}}或者:uchar* p = I.data;//将图像的数据空间给pfor( unsigned int i =0;i < ncol*nrows; ++i)*p++ = table[*p];//*p中存储了图像的数据,一个一个赋值或者:LUT(I,lookUpTable,J); //效率最高的读图方式Mat lookUpTable(1, 256,CV_8U);uchar * p2 = lookUpTable.data;for( int i = 0;i < 256; ++i)p2[i] = table[i];图像的RGB分离:const int channels = I.channels();switch(channels){case 1:{MatIterator_<uchar> it,end;//灰度图像的变换for(it = I.begin<uchar>(),end = I.end<uchar>();it != end; ++it)*it = table[*it];break;}case 3:{MatIterator_<Vec3b> it,end;//RGB图像的变换for(it = I.begin<Vec3b>(),end = I.end<Vec3b>();it != end; ++it)//<Vec3b>指三列向量,即三个通道分量{(*it)[0] = table[(*it)[0]];//B分量(*it)[1] = table[(*it)[1]]; //G分量(*it)[2] = table[(*it)[2]]; //R分量}}}或者:case 3:{Mat_<Vec3b> _I = I;for( int i = 0;i < I.rows; ++i)for( int j = 0;j < I.cols; ++j){_I(i,j)[0] = table[_I(i,j)[0]];_I(i,j)[1] = table[_I(i,j)[1]];_I(i,j)[2] = table[_I(i,j)[2]];}I = _I;break;}Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)//看图函数Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table) //看图函数Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table) //看图函数模板运算:void Sharpen(const Mat& myImage, Mat& Result) //图像锐化函数CV_Assert(myImage.depth() == CV_8U); //判决图像是否是整型的数据Result.create(myImage.size(),myImage.type());//创建MAT矩阵类型执行算法:for(int j = 1 ;j < myImage.rows-1; ++j){const uchar* previous = myImage.ptr<uchar>(j - 1);const uchar* current = myIma ge.ptr<uchar>(j);const uchar* next = myImage.ptr<uchar>(j + 1);uchar* output = Result.ptr<uchar>(j);for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i){*output++ = saturate_cast<uchar>(5*current[i]-current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);}}Result.row(0).setTo(Scalar(0));//将0行的像素值设为0或者:Mat kern = (Mat_<char>(3,3) << 0, -1, 0,-1, 5, -1,0, -1, 0);filter2D(I,K,I.depth(),kern);//使用模板滤波锐化图像,该函数所在库为<opencv2/imgproc/imgproc.hpp>图像融合算法:addWeighted(src1,alpha,src2,beta, 0.0,dst);//融合函数,需两幅图像一样大图像的亮度调整算法:相应的代码for( int y = 0;y < image.rows;y++ ){ for( int x = 0;x < image.cols;x++ ){ for( int c = 0;c < 3;c++ ) //三个通道分别运算{new_image.at<Vec3b>(y,x)[c] =saturate_cast<uchar>(alpha*(image.at<Vec3b>(y,x)[c]) + beta);}}}Mat::zeros(image.size(),image.type());//创建0阵image.convertTo(new_image, -1,alpha,beta);//线性图像变换图元:Point pt = Point(10, 8);//点的坐标Scalar(B,G,R) ;//给出像素的颜色值ellipse( img,Point(x,y),Size(x,y), angle,0, 360,Scalar( 255, 0, 0 ),thickness, lineType );//画椭圆,img图像名,point中心点,size大小,angle角度,0,起始点角度,360终点角度,scalar色彩,thickness线宽(-1为全填充),lineType 线型;调用时凡是给定的参数不管,只需给出其他参数,例如Ellipse( atom_image, 90 );给出了图像名和角度,其他量为已知。

个人整理的opencv最基本入门资料

个人整理的opencv最基本入门资料
Opencv 资料
---- By Moco Sun 2010.12.19
1. 简介 OpenCV 的全称是:Open Source Computer Vision Library,Intel 公司支持的开源计算机视
觉库,采用 c/c++编写,可以运行在 linux/windows/mac 等操作系统上。Opencv 还提供了 python、ruby、matlab 以及其他语言的接口。
//读取图像宽度 //读取图像高度 //读取图像通道数 //读取图像一行像素所占的字节数
{ pchar = (uchar*)image->imageData + i*widthStep; for (j=0; j<width; j++) { uchar* temp = pchar + j*channel; temp[0] += 10;//通道B temp[1] += 10;//通道G temp[2] += 10;//通道R }
其目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的 计算机视觉相关应用程序。Opencv 包含的函数有 500 多个,覆盖了如工厂产品检测、医学 成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等,具体将在下面介绍。 Opencv 使用宽松的 BSD 开源协议,在遵守协议的情况下,允许生成商业产品,不必开发源 代码。
CvSize表示图像的大小,为含两个int的结构体,定义如下
typedef struct CvSize { int width; int height; }
CvSize; 小贴士
Cv与cv的区别:以Cv开头的一般是函数,以cv开头的通常是内联数据元素。 CvPoint结构体不支持默认构造函数,但是可以通过inline的cvPoint(注意首字母小写)函数来创 建一个无名的CvPoint,这在传递一些函数参数经常使用,同理,CvScalar与cvScalar,CvSize与 cvSize等也有这样的用法。

在MFC中使用OpenCV教程

在MFC中使用OpenCV教程

典型例图 ExampleL.bmp、 ExampleQ.bmp
简要说明 仅适用于单连通区域, 不能处理多连通区域与孔边界
ExampleC.bmp、
适用各类二值图像,使用范围较宽
SteelBar.bmp、pic3.png 图像反相后也可进行处理,得到不同结果
ExampleD.bmp
为灰值形态学运算,波谷检测又称黑顶帽变换
三、用 DirectShow 编制的视频采集程序 采用 DirectShow 实现视频采集,其优点是支持高分辨率图像采集,最高分辨率由所用的摄像头决定, 如罗技 130 万像素 USB 摄像头 C300 最高分辨率可达 1280*1024,在 MPEG 模式下采集速度为每秒 15 帧。 使用时 CPU 的时间占用率在 15~30%之间。 通过多图像平均可以采集得到质量不错的图像,经过 4 幅图像平均采集所得图像的信噪比可提高一倍。 由于需要连续采集多帧图像,约需 0.25 秒,故适宜采集静态或缓慢移动对象的图像。 视频采集功能调用 OpenCV China 网站下载的软件 camerads 中的函数实现。
主要内容
下面列出 stdafx.h 尾部集中的几个头文件,程序结构由此可见一斑。
#include "CVMFC.h"
// 窗口管理
#include "cv.h" #include "highgui.h"
// OpenCV 头文件
#include "CameraDS.h" #include "CVDSCap.h"
图像反相后处理与另一方法直接处理等价
lena.jpg、fruits.jpg lena.jpg、fruits.jpg

OpenCV读取图像 显示图像和保存图像

OpenCV读取图像 显示图像和保存图像

读入图像﹑显示图像和保存图像是图像处理过程中最基本的,也是必不可少的操作.配置好OpenCV以后,包含以下两个头文件:#include "cv.h"#include "highgui.h"IplImage* image=cvLoadImage("D:\\123.jpg",-1);//函数cvLoadImage()的第1个参数是图像文件的路径.//第2个参数是读取图像的方式:-1表示按照图像本身的类型来读取,1表示强制彩色化,0表示//强制灰值化.if(image==NULL){MessageBox("无法读取图像数据!", "提示",MB_OK);//在MFC工程中这样用//若在win32控制台程序中,用printf("无法读取图像数据!\n");return;//不作任何操作,就不会执行后面的程序了}cvNamedWindow("图像显示",CV_WINDOW_AUTOSIZE);//该函数的功能是按照指定方式创建一个窗口,用于显示图像.//第1个参数是窗口的名称,自己可以任意设置//第2个参数表示窗口的大小会自动根据图像尺寸而变化cvShowImage("图像显示",image);//该函数的功能是在指定的窗口上显示图像.//第1个参数是显示图像窗口的名称//第2个参数是要显示的图像cvSaveImage("D:\\saveImage.jpg",image);//该函数的功能是将图像另存为//第1个参数是保存的路径,自己可以设置其它路径//第2个参数是要保存的图像cvWaitKey(0);//一直等待按键没有这句的话图像不能正常显示cvReleaseImage(&image);//释放图像内存cvDestroyWindow("图像显示");//销毁窗口资源//读取和显示完图像之后,要及时释放所占的内存资源.运行示例:。

opencvPPT

opencvPPT

1.AdaptiveThreshold自适应阈值方法 void cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int threshold_type=CV_THRESH_BINARY, int block_size=3, double param1=5 ); 函数 cvAdaptiveThreshold 将灰度图像变换到二值图像 2.Threshold对数组元素进行固定阈值操作 void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); 函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈 值操作得到二值图像。 或者是去掉噪声,例如过滤很小或很大象素值的图像点。 3.CvtColor色彩空间转换 void cvCvtColor( const CvArr* src, CvArr* dst, int code ); 函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。 4.Integral计算积分图像 void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL ); 利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和、求均值以 及标准方差的计算,并且保证运算的复杂度为O(1)。 可以在变化的窗口内做快速平滑或窗口相关等操作。 5.Filter2D对图像做卷积 void cvFilter2D( const CvArr* src, CvArr* dst,const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); 6.Smooth各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0 );
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据存储OpenCV提供了一种机制来序列化(serialize)和去序列化(de-serialize)其各种数据类型,可以从磁盘中按YAML或XML格式读/写。

在第4章中,我们将专门介绍存储和调用常见的对象IplImages的函数(cvSaveImage()和cvLoadImage())。

此外,第4章将讨论读/写视频的特有函数:可以从文件或者摄影机中读取数据的函数cvGrabFrame()以及写操作函数cvCreateVideoWriter()和cvWriteFrame()。

本小节将侧重于一般对象的永久存储:读/写矩阵、OpenCV结构、配置与日志文件。

首先,我们从有效且简便的OpenCV矩阵的保存和读取功能函数开始。

函数是cvSave()和cvLoad()。

例3-15展示了如何保存和读取一个5×5的单位矩阵(对角线上是1,其余地方都是0)。

例3-15:存储和读取CvMat1.CvMat A= cvMat( 5, 5, CV_32F, the_matrix_data );2.3.cvSave( "my_matrix.xml", &A );4.. . .5.// to load it then in some other program use …6.CvMat* A1= (CvMat*) cvLoad( "my_matrix.xml" );CxCore参考手册中有整节内容都在讨论数据存储。

首先要知道,在OpenCV中,一般的数据存储要先创建一个CvFileStorage结构(如例3-16)所示,该结构将内存对象存储在一个树形结构中。

然后通过使用CV_STORAGE_READ参数的cvOpenFileStorage()从磁盘读取数据,创建填充该结构,也可以通过使用CV_STORAGE_WRITE的cvOpenFileStorage()创建并打开CvFileStorage写数据,而后使用适当的数据存储函数来填充它。

在磁盘上,数据的存储格式为XML或者YAML。

例3-16:CvFileStorage结构,数据通过CxCore数据存储函数访问1.typedef struct CvFileStorage2.{3.... // hidden fields4.} CvFileStorage;CvFileStorage树内部的数据是一个层次化的数据集合,包括标量、CxCore对象(矩阵、序列和图)以及用户定义的对象。

假如有一个配置文件或日志文件。

配置文件告诉我们视频有多少帧(10),画面大小(320×240)并且将应用一个3×3的色彩转换矩阵。

例3-17展示了如何从磁盘中调出cfg.xml文件。

例3-17:往磁盘上写一个配置文件cfg.xml1.CvFileStorage* fs= cvOpenFileStorage(2."cfg.xml",3.0,4.CV_STORAGE_WRITE5.);6.cvWriteInt( fs, "frame_count", 10 );7.cvStartWriteStruct( fs, "frame_size", CV_NODE_SEQ );8.cvWriteInt( fs, 0, 320 );9.cvWriteInt( fs, 0, 200 );10.cvEndWriteStruct(fs);11.cvWrite( fs, "color_cvt_matrix", cmatrix );12.cvReleaseFileStorage( &fs );请留意这个例子中的一些关键函数。

我们可以定义一个整型变量通过cvWritelnt()向结构中写数据。

我们也可以使用cvStartWriteStruct()来创建任意一个可以任选一个名称(如果无名称请输入0或NULL)的结构。

这个结构有两个未命名的整型变量,使用cvEndWriteStruct()结束编写结构。

如果有更多的结构体,我们用相似的方法来解决;这种结构可以进行任意深度的嵌套。

最后,我们使用cvWrite()编写处色彩转换矩阵。

将这个相对复杂的矩阵程序与例3-15中简单的cvSave()程序进行对比。

便会发现cvSave()是cvWrite()在只保存一个矩阵时的快捷方式。

当写完数据后,使用cvReleaseFileStorage()释放CvFileStorage句柄。

例3-18显示了XML格式的输出内容。

例3-18:磁盘中的cfg.xml文件1.<?xml version="1.0"?>2.<opencv_storage>3.<frame_count>10</frame_count>4.<frame_size>320 200</frame_size>5.<color_cvt_matrix type_id="opencv-matrix">6.<rows>3</rows><cols>3</cols>7.<dt>f</dt>8.<data>...</data></color_cvt_matrix>9.</opencv_storage>我们将会在例3-19中将这个配置文件读入。

例3-19:磁盘中的cfg.xml文件1.CvFileStorage* fs= cvOpenFileStorage(2."cfg.xml",3.0,4.CV_STORAGE_READ5.);6.7.int frame_count= cvReadIntByName(8.fs,9.0,10."frame_count",11. 5 /* default value */12.);13.14.CvSeq* s= cvGetFileNodeByName(fs,0,"frame_size")->data.seq;15.16.int frame_width= cvReadInt(17.(CvFileNode*)cvGetSeqElem(s,0)18.);19.20.int frame_height= cvReadInt(21.(CvFileNode*)cvGetSeqElem(s,1)22.);23.24.CvMat* color_cvt_matrix= (CvMat*) cvReadByName(25.fs,26.0,27."color_cvt_matrix"28.);29.30.cvReleaseFileStorage( &fs );在阅读时,我们像例3-19中那样用cvOpenFileStorage()打开XML配置文件。

然后用cvReadlntByName()来读取frame_count,如果有没有读到的数,则赋一个默认值。

在这个例子中默认的值是5。

然后使用cvGetFileNodeByName()得到结构体frame_size。

在这里我们用cvReadlnt()读两个无名称的整型数据。

随后使用cvReadByName()读出我们已经定义的色彩转换矩阵。

将本例与例3-15中的cvLoad()进行对比。

如果我们只有一个矩阵要读取,那么可以使用cvLoad(),但是如果矩阵是内嵌在一个较大的结构中,必须使用cvRead()。

最后,释放CvFileStorage结构。

数据函数存储与CvFileStorage结构相关的表单列在表3-16中。

想了解更多细节,请查看CxCore手册。

表3-16:数据存储函数续表This line causes the error:> cvWrite(myFileStorage," X,Y,Reflectance", point3DSequence);It is too advanced syntax to be understood by OpenCV writing functions, namely, the tag name could not contain spaces or comma's.If you want to store each point as a structure,you may try the following:cvStartWriteStruct( myFileStorage, "point3DSequence", CV_NODE_SEQ ); for( i = 0; i < point3DSequence->total; i++ ){CvPoint3D32f* pt=(CvPoint3D32f*)cvGetSeqElem(point3DSequence,i); cvStartWriteStruct(myFileStorage, 0, CV_NODE_MAP+CV_NODE_FLOW); cvWriteReal( myFileStorage, "x", pt->x );cvWriteReal( myFileStorage, "y", pt->y );cvWriteReal( myFileStorage, "reflectance", pt->z ); cvEndWriteStruct( myFileStorage );}cvEndWriteStruct( myFileStorage );that will look nice, but a little bit bulky and then you willhave to read the elements manually from the filestorage.Or, if the all the data could be just written as a plain array:x0 y0 refl0 x1 y1 refl1 ...then just use:cvWrite( myFileStorage, "point3DSequence", point3DSequence );。

相关文档
最新文档