0

我正在尝试将“cv::FileStorage”中包含的内容“读取”到 CvRTrees(CvStatModel 实现之一)中。

“读取”函数需要一个 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 *'

两种解决方案都在编译时失败(总是因为“读取”的第二个参数)。

你们知道怎么处理吗?

提前致谢。

阿舒姆

4

3 回答 3

1

是的,这里有点笨拙,您必须使用重载的 * 运算符从 FileStorage 访问 CvFileNode:

FileStorage fs("my.yml", FileStorage::WRITE);
dtree.write(*fs,"dst");
于 2014-06-11T05:55:38.030 回答
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. 简历::文件存储
  2. CvR树
  3. CvStatModel::读取
于 2013-06-27T21:55:23.603 回答
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应该工作。

于 2014-06-10T23:56:53.537 回答