将cv :: FileStorage转换为CvFileStorage

时间:2013-06-27 21:15:40

标签: c++ opencv

我试图将“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

3 个答案:

答案 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()) );

但我不确定这是否正确称呼它......

文档链接:

  1. cv::FileStorage
  2. CvRTrees
  3. CvStatModel::read

答案 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即可。