opencv2.2的FileStorage的>>操作符居然不支持数字形式的字符串做key!!
FileStorage fs("test.yml", FileStorage::WRITE);
fs<<"node"<<""{"<<"10"<<"}";
居然不行,运行时错误!
抛出异常:
OpenCV Error: Unspecified error (Incorrect element name 10) in unknown function, file d:/TDDOWNLOAD/OpenCV-2.2.0/modules/core/src/persistence.cpp, line 5043 d:/TDDOWNLOAD/OpenCV-2.2.0modules/core/src/persistence.cpp:5043: error: (-2) Incorrect element name 10
但是改为:
fs<<"node"<<""{"<<"t10"<<"}";
就可以,真是无语了,
使用了一个for循环往文件中写参数;
for (int i=0; i<vec.size(); ++i)
{
sprintf_s(ttnode, 10, "%d",i);
fs<<string(ttnode)<<"["<<vec[i].id1<<vec[i].idm1<<vec[i].id2<<vec[i].idm2<<"]";
}
调了一下午一直以为是const的原因,(opencv的源码中<<需要的参数是const char*或者const string)逼得我甚至写了一个const string cstr[256]={"0"...."255"};来解决,结果还是出问题;
定义一个const std::string nn[2]={"name","nnoi"};
结果就行!!!我愤怒了!!!
后来又找了一个官方网站上的imagelist_creator.cpp的例子看最后是这样:fs << string(av[i]);
纳闷了!为什么呢!
在分析发现我的ttnode中是"数值"格式,而定义的那个nn[2]却不是,而且imagelist_creator.cpp的av[i]肯定也不是数值形式的字符串。
终于找到问题了,原来是不支持纯数字式的字符串作为key,不知道是yaml格式的原因还是opencv的原因,知道问题那就好办了,改一下就行了!
for (int i=0; i<vec.size(); ++i)
{
sprintf_s(ttnode, 10, "t%d",i);
fs<<string(ttnode)<<"["<<vec[i].id1<<vec[i].idm1<<vec[i].id2<<vec[i].idm2<<"]";
}