opencv中的FileStorage类使用注意事项
2016-03-31 20:32
447 查看
FileStorage类是opencv中用来进行文件操作的封装类,可以对XML,YAML,txt甚至doc文件进行读写操作。在使用opencv时经常需要对特征数据等进行保存,这时候通常会选择XML文件或者YAML文件。xml和yaml都是属于标记语言,开发者可以根据自身需要定义标签。同时他们也是一种语义/结构化语言,他们可以描述文档的结构和语义。FileStorage类可以对C++的基础数据类型(int,float,double等)、容器类(vector,maps)、opencv定义的数据结构(Mat,Scalar等)进行读写操作。
FileStorage类的使用流程如下:
(1)实例化一个FileStorage类对象
(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作
(3)使用FileStorage::release()函数析构掉类对象,并关闭文件
给出具体实例:
参考:http://www.cnblogs.com/marcworld/p/3744747.html?utm_source=tuicool&utm_medium=referral
OpenCV Error: Bad argument (Key name may only contain alphanumeric characters [a-zA-Z0-9]
fs<<"[";代表向量vector的开始,后续输入则是向量容器中具体数据
fs<<"]";表示之前的vector输入结束.
FileStorage类的使用流程如下:
(1)实例化一个FileStorage类对象
(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作
(3)使用FileStorage::release()函数析构掉类对象,并关闭文件
给出具体实例:
参考:http://www.cnblogs.com/marcworld/p/3744747.html?utm_source=tuicool&utm_medium=referral
#include <opencv2/core/core.hpp> #include <iostream> #include <string> using namespace std; using namespace cv; int main(int argc, char* argv[]) { //打开XML文件 string filename = "I.xml"; //------------(1)------------ FileStorage fs(filename, FileStorage::WRITE); //------------(2)------------ //fs.open(filename, FileStorage::READ); //----------------简单数据结构输入输出---------------- //输出数字和文本 fs << "iterationNr" << 100; //输入数字和文本 //fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ" //int itNr; //------------(1)------------ //fs["iterationNr"] >> itNr; //------------(2)------------ //itNr = (int)fs["iterationNr"]; //cout<<"iterationNr "<<itNr; //输出大型数据结构Mat Mat R = Mat_<uchar >::eye (3, 3), T = Mat_<double>::zeros(3, 1); fs << "R" << R; fs << "T" << T; //输入Mat //fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ" //fs["R"] >> R; //fs["T"] >> T; //---------------------------------------------------------- //----------------复杂数据结构输入输出---------------- //输出数组(vector),[]表示vector的边界 fs<<"strings"; fs<<"["; fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg"; fs<<"]"; //输出maps.{}表示maps的边界 fs<<"Mapping"; fs<<"{"; fs<<"One"<<1; fs<<"Two"<<2; fs<<"}"; //输入数组 fs.open(filename, FileStorage::READ); //不要忘记将fs重定向为"READ" FileNode n = fs["strings"]; // 读取字符串序列 - 获取节点 if (n.type() != FileNode::SEQ) { cerr << "strings is not a sequence! FAIL" << endl; return 1; } FileNodeIterator it = n.begin(), it_end = n.end(); // 遍历节点 for (; it != it_end; ++it) cout << (string)*it << endl; //输入maps n = fs["Mapping"]; // 从序列中读取map cout << "Two " << (int)(n["Two"]) << endl; cout << "One " << (int)(n["One"]) << endl; //---------------------------------------------------------- //关闭XML文件 fs.release(); return 0; }
注意:由于XML和YAML是标签语言,通过类似<book>、<name>等来区分不同内容数据。例子中
//输出数组(vector) fs<<"strings"; fs<<"["; fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg"; fs<<"]";fs<<"strings";输入的是标签,这里切不可写成fs<<"strings:"如果多加了个冒号则会报错:
OpenCV Error: Bad argument (Key name may only contain alphanumeric characters [a-zA-Z0-9]
fs<<"[";代表向量vector的开始,后续输入则是向量容器中具体数据
fs<<"]";表示之前的vector输入结束.
相关文章推荐
- IIS 错误 Server Application Error 详细解决方法
- 表格标签table深入了解
- WEB标准网页布局中尽量不要使用的HTML标签
- 如何使用jquery easyui创建标签组件
- Lua教程(六):编译执行与错误
- 完美解决Persits.Jpeg.1 错误 ''800a0001''
- "在试着设置任务帐户信息时出现错误,指定的错误是:0x80070005:拒绝访问
- Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止。
- MySQL命令行界面中出现字符错误提示的原因及解决方法
- 修复ShopNC使用QQ 互联时提示100010 错误
- web标准知识――用途相似的标签
- mysql错误处理之ERROR 1665 (HY000)
- 使用Raygun对Node.js应用进行错误处理的方法
- C#新手常犯的错误汇总
- h1标签的使用技巧
- php自定义错误处理用法实例
- Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
- 使用PHP的错误处理
- msxml3.dll 错误 '800c0005'解决方案
- asp提示Server 对象 错误 ASP 0178 : 80070005