Opencv文件操作与数据存储

上传人:平*** 文档编号:13357677 上传时间:2017-10-23 格式:DOC 页数:4 大小:69.77KB
返回 下载 相关 举报
Opencv文件操作与数据存储_第1页
第1页 / 共4页
Opencv文件操作与数据存储_第2页
第2页 / 共4页
Opencv文件操作与数据存储_第3页
第3页 / 共4页
Opencv文件操作与数据存储_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Opencv文件操作与数据存储》由会员分享,可在线阅读,更多相关《Opencv文件操作与数据存储(4页珍藏版)》请在金锄头文库上搜索。

1、数据存储OpenCV 提供了一种机制来序列化(serialize)和去序列化(de-serialize)其各种数据类型,可以从磁盘中按YAML 或 XML 格式读 /写。在第 4 章中,我们将专门介绍存储和调用常见的对象 IplImages 的函数(cvSaveImage()和 cvLoadImage()。此外,第 4 章将讨论读/ 写视频的特有函数:可以从文件或者摄影机中读取数据的函数 cvGrabFrame()以及写操作函数 cvCreateVideoWriter()和 cvWriteFrame()。本小节将侧重于一般对象的永久存储:读/写矩阵、OpenCV 结构、配置与日志文件。首先,我

2、们从有效且简便的 OpenCV 矩阵的保存和读取功能函数开始。函数是 cvSave()和 cvLoad()。例 3-15 展示了如何保存和读取一个 55 的单位矩阵(对角线上是 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_ma

3、trix.xml ); CxCore 参考手册中有整节内容都在讨论数据存储。首先要知道,在 OpenCV 中,一般的数据存储要先创建一个 CvFileStorage 结构(如例 3-16)所示,该结构将内存对象存储在一个树形结构中。然后通过使用CV_STORAGE_READ 参数的 cvOpenFileStorage()从磁盘读取数据,创建填充该结构,也可以通过使用CV_STORAGE_WRITE 的 cvOpenFileStorage()创建并打开 CvFileStorage 写数据,而后使用适当的数据存储函数来填充它。在磁盘上,数据的存储格式为 XML 或者 YAML。例 3-16:CvF

4、ileStorage 结构,数据通过 CxCore 数据存储函数访问1. typedef struct CvFileStorage 2. 3. . / hidden fields 4. CvFileStorage; CvFileStorage 树内部的数据是一个层次化的数据集合,包括标量、CxCore 对象(矩阵、序列和图)以及用户定义的对象。假如有一个配置文件或日志文件。配置文件告诉我们视频有多少帧(10),画面大小(320240)并且将应用一个 33 的色彩转换矩阵。例 3-17 展示了如何从磁盘中调出 cfg.xml 文件。例 3-17:往磁盘上写一个配置文件 cfg.xml1. CvF

5、ileStorage* fs = cvOpenFileStorage( 2. cfg.xml, 3. 0, 4. CV_STORAGE_WRITE 5. ); 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 )

6、; 12. cvReleaseFileStorage( &fs ); 请留意这个例子中的一些关键函数。我们可以定义一个整型变量通过 cvWritelnt()向结构中写数据。我们也可以使用 cvStartWriteStruct()来创建任意一个可以任选一个名称(如果无名称请输入 0 或 NULL)的结构。这个结构有两个未命名的整型变量,使用 cvEndWriteStruct()结束编写结构。如果有更多的结构体,我们用相似的方法来解决;这种结构可以进行任意深度的嵌套。最后,我们使用 cvWrite()编写处色彩转换矩阵。将这个相对复杂的矩阵程序与例 3-15 中简单的 cvSave()程序进行对比

7、。便会发现 cvSave()是 cvWrite()在只保存一个矩阵时的快捷方式。当写完数据后,使用 cvReleaseFileStorage()释放 CvFileStorage 句柄。例 3-18 显示了 XML格式的输出内容。例 3-18:磁盘中的 cfg.xml 文件1. 2. 3. 10 4. 320 200 5. 6. 3 3 7. f 8. . 9. 我们将会在例 3-19 中将这个配置文件读入。例 3-19:磁盘中的 cfg.xml 文件1. CvFileStorage* fs = cvOpenFileStorage( 2. cfg.xml, 3. 0, 4. CV_STORAGE

8、_READ 5. ); 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( 2

9、1. (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。然后使用

10、 cvGetFileNodeByName()得到结构体 frame_size。在这里我们用 cvReadlnt()读两个无名称的整型数据。随后使用 cvReadByName()读出我们已经定义的色彩转换矩阵。 将本例与例 3-15 中的 cvLoad()进行对比。如果我们只有一个矩阵要读取,那么可以使用 cvLoad(),但是如果矩阵是内嵌在一个较大的结构中,必须使用 cvRead()。最后,释放 CvFileStorage 结构。数据函数存储与 CvFileStorage 结构相关的表单列在表 3-16 中。想了解更多细节,请查看 CxCore 手册。表 3-16:数据存储函数函数名称 描述

11、打开并释放 cvOpenFileStorage 为读/写打开存储文件cvReleaseFileStorage 释放存储的数据写入 cvStartWriteStruct 开始写入新的数据结构cvEndWriteStruct 结束写入数据结构cvWriteInt 写入整数型cvWriteReal 写入浮点型cvWriteString 写入字符串cvWriteComment 写一个 XML或 YAML的注释字串cvWrite 写一个对象,例如 CvMatcvWriteRawData 写入多个数值cvWriteFileNode 将文件节点写入另一个文件存储器读取 cvGetRootFileNode 获

12、取存储器最顶层的节点cvGetFileNodeByName 在映图或存储器中找到相应节点cvGetHashedKey 为名称返回一个惟一的指针cvGetFileNode 在映图或文件存储器中找到节点cvGetFileNodeName 返回文件的节点名cvReadInt 读取一个无名称的整数型cvReadIntByName 读取一个有名称的整数型cvReadReal 读取一个无名称的浮点型续表函数 描述cvReadRealByName 读取一个有名称的浮点型cvReadString 从文件节点中寻找字符串cvReadStringByName 找到一个有名称的文件节点并返回它cvRead 将对象解

13、码并返回它的指针cvReadByName 找到对象并解码cvReadRawData 读取多个数值cvStartReadRawData 初始化文件节点序列的读取cvReadRawDataSlice 读取文件节点的内容This line causes the error: cvWrite(myFileStorage, X,Y,Reflectance, point3DSequence);It is too advanced syntax to be understood by OpenCV writingfunctions, namely, the tag name could not contai

14、n spaces or commas.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 total; i+ )CvPoint3D32f* pt=(CvPoint3D32f*)cvGetSeqElem(point3DSequence,i);cvStartWriteStruct(myFileStorage, 0, CV_NODE_MAP+CV_N

15、ODE_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 );

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号