C++ 将cv::FileStorage转换为CvFileStorage

C++ 将cv::FileStorage转换为CvFileStorage,c++,opencv,C++,Opencv,我试图将“cv::FileStorage”中包含的内容“读取”到CvRTrees(CvStatModel实现之一)中 “read”函数需要一个CvFileStorage*和一个CvFileNode*(第二个参数) 似乎我可以从cv::FileStorage获取CvFileStorage,但我无法获取CvFileNode* 函数(fs.getFirstTopLevelNode().node和fs[“someName”])都返回“const CvFileNode*”而不是“CvFileNode*”,

我试图将“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'
error C2664: 'CvRTrees::read' : cannot convert parameter 2 from 'const CvFileNode *' to 'CvFileNode *'
CvFileStorage的定义是:typedef struct CvFileStorage CvFileStorage

错误:

error C2027: use of undefined type 'CvFileStorage'
error C2664: 'CvRTrees::read' : cannot convert parameter 2 from 'const CvFileNode *' to 'CvFileNode *'
两种解决方案在编译时都失败(总是因为第二个参数“read”)

你们知道怎么处理吗

提前谢谢


Achoum

我认为你应该使用
加载
,而不是
读取

如果不可能,请更正为:

rtree->read(&fs,&(fs.getFirstTopLevelNode()) );
这至少应该可以编译

如果是这样,你想要的似乎是:

rtree->read(&fs,&(fs["mytree"]) );
否则,请尝试使用过时的:

rtree->read(fs.operator*(),&(fs.getFirstTopLevelNode()) );
但我不确定这是不是正确的称呼

文档链接:


  • 我遇到了同样的问题(读取比加载更一般,因为您可以在同一个文件存储中存储多个结构)

    我找到了这个解决方案:

    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
    就可以了。

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

    FileStorage fs("my.yml", FileStorage::WRITE);
    dtree.write(*fs,"dst");
    

    那么,让我们从。。。看比赛,给我点时间…:)它是“一些东西”或其他东西(即,一个有效的文件名),或者它真的是“一些东西”?什么是rtree?你能把它放在申报单上吗?不管怎样,如果你只放内存而不读会怎么样?啊,好吧,编译失败,这很重要。哪个是错误?或者可能是文档的其余部分,读到的是我希望能够使用load/save,但是模型(树)没有保存在field中,我希望避免使用临时文件。它实际上不编译:&fs是cv:FileStorage,函数需要CvFileStorage