资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
数据存储OpenCV 提供了一种机制来序列化(serialize)和去序列化(de-serialize)其各种数据类型,可以从磁盘中按YAML 或 XML 格式读 /写。在第 4 章中,我们将专门介绍存储和调用常见的对象 IplImages 的函数(cvSaveImage()和 cvLoadImage()。此外,第 4 章将讨论读/ 写视频的特有函数:可以从文件或者摄影机中读取数据的函数 cvGrabFrame()以及写操作函数 cvCreateVideoWriter()和 cvWriteFrame()。本小节将侧重于一般对象的永久存储:读/写矩阵、OpenCV 结构、配置与日志文件。首先,我们从有效且简便的 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_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 CvFileStorage 2. 3. . / hidden fields 4. CvFileStorage; CvFileStorage 树内部的数据是一个层次化的数据集合,包括标量、CxCore 对象(矩阵、序列和图)以及用户定义的对象。假如有一个配置文件或日志文件。配置文件告诉我们视频有多少帧(10),画面大小(320240)并且将应用一个 33 的色彩转换矩阵。例 3-17 展示了如何从磁盘中调出 cfg.xml 文件。例 3-17:往磁盘上写一个配置文件 cfg.xml1. CvFileStorage* 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 ); 12. cvReleaseFileStorage( &fs ); 请留意这个例子中的一些关键函数。我们可以定义一个整型变量通过 cvWritelnt()向结构中写数据。我们也可以使用 cvStartWriteStruct()来创建任意一个可以任选一个名称(如果无名称请输入 0 或 NULL)的结构。这个结构有两个未命名的整型变量,使用 cvEndWriteStruct()结束编写结构。如果有更多的结构体,我们用相似的方法来解决;这种结构可以进行任意深度的嵌套。最后,我们使用 cvWrite()编写处色彩转换矩阵。将这个相对复杂的矩阵程序与例 3-15 中简单的 cvSave()程序进行对比。便会发现 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_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( 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:数据存储函数函数名称 描述打开并释放 cvOpenFileStorage 为读/写打开存储文件cvReleaseFileStorage 释放存储的数据写入 cvStartWriteStruct 开始写入新的数据结构cvEndWriteStruct 结束写入数据结构cvWriteInt 写入整数型cvWriteReal 写入浮点型cvWriteString 写入字符串cvWriteComment 写一个 XML或 YAML的注释字串cvWrite 写一个对象,例如 CvMatcvWriteRawData 写入多个数值cvWriteFileNode 将文件节点写入另一个文件存储器读取 cvGetRootFileNode 获取存储器最顶层的节点cvGetFileNodeByName 在映图或存储器中找到相应节点cvGetHashedKey 为名称返回一个惟一的指针cvGetFileNode 在映图或文件存储器中找到节点cvGetFileNodeName 返回文件的节点名cvReadInt 读取一个无名称的整数型cvReadIntByName 读取一个有名称的整数型cvReadReal 读取一个无名称的浮点型续表函数 描述cvReadRealByName 读取一个有名称的浮点型cvReadString 从文件节点中寻找字符串cvReadStringByName 找到一个有名称的文件节点并返回它cvRead 将对象解码并返回它的指针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 contain 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_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 );
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号