我试图将“cv :: FileStorage”中包含的内容“读取”到CvRTrees(CvStatModel实现之一)中。
“read”函数需要CvFileStorage *和CvFileNode *(第二个参数)
似乎我可以从cv :: FileStorage获得CvFileStorage,但是我无法获得CvFileNode *。
函数(fs.getFirstTopLevelNode()。node和fs [“someName”])都返回“const CvFileNode *”而不是“CvFileNode *”,而(另一种解决方案)我无法到达内部CvFileStorage *
到目前为止,我正在尝试解决方案:
string s = "some stuffs" // in the real code, "s" is actually exported from a rtree ("write" function)
cv::FileStorage fs(s, cv::FileStorage::READ + cv::FileStorage::MEMORY);
CvRTrees* rtree = new CvRTrees();
rtree->read(fs.fs,fs.fs->cvGetFileNodeByName("mytree"));
错误:
error C2027: use of undefined type 'CvFileStorage'
CvFileStorage的定义是:typedef struct CvFileStorage CvFileStorage;
或
string s = "some stuffs"
cv::FileStorage fs(s, cv::FileStorage::READ + cv::FileStorage::MEMORY);
CvRTrees* rtree = new CvRTrees();
rtree->read(fs.fs,fs["mytree"].node);
错误:
error C2664: 'CvRTrees::read' : cannot convert parameter 2 from 'const CvFileNode *' to 'CvFileNode *'
两个解决方案都在编译时失败(总是因为“读取”的第二个参数)。
你们知道如何应对吗?
提前致谢。
Achoum
答案 0 :(得分:1)
是的,这里有点笨拙,你必须使用重载*运算符从FileStorage访问CvFileNode:
FileStorage fs("my.yml", FileStorage::WRITE);
dtree.write(*fs,"dst");
答案 1 :(得分:0)
我认为你应该使用load
,而不是read
http://docs.opencv.org/modules/ml/doc/statistical_models.html#cvstatmodel-load:
Loads the model from a file.
void CvStatModel::load(const char* filename, const char* name=0 )
The method load loads the complete model state with the specified name
(or default model-dependent name) from the specified XML or YAML file.
The previous model state is cleared by CvStatModel::clear()
如果无法做到这一点,请更正:
rtree->read(&fs,&(fs.getFirstTopLevelNode()) );
这至少应该编译。
如果确实如此,那么你想要的就是这个:
rtree->read(&fs,&(fs["mytree"]) );
否则,请尝试过时的:
rtree->read(fs.operator*(),&(fs.getFirstTopLevelNode()) );
但我不确定这是否正确称呼它......
文档链接:
答案 2 :(得分:0)
我遇到了同样的问题(读取比加载更通用,因为你可以在同一个FileStorage中存储多个结构)。
我找到了这个解决方案:
FileStorage::operator*
// Returns the obsolete C FileStorage structure.
C++: CvFileStorage* FileStorage::operator*()
C++: const CvFileStorage* FileStorage::operator*() const
// Returns: Pointer to the underlying C FileStorage structure
所以只需调用*fs
即可。