OpenCV 4.2.0 FileStorage 分段错误

Posted

技术标签:

【中文标题】OpenCV 4.2.0 FileStorage 分段错误【英文标题】:OpenCV 4.2.0 FileStorage segmentation fault 【发布时间】:2020-02-06 09:15:23 【问题描述】:

[这是对 OpenCV 问答论坛上this 问题的转贴。]

嗨!我在使用 this YML file (pastebin) 的 FileStorage API (以及我在 OpenCV 上抛出的任何其他 YML)时遇到了一个大问题。基本上,每当我尝试访问任何FileNode 的信息时,程序都会出现段错误。

起初,我认为这是由于我在 macOS 上构建的自定义 OpenCV,但在尝试使用预构建的 OpenCV 4.2.0 Windows 二进制文件后,问题仍然存在。

在 LLDB 中搞砸了,我发现崩溃发生在

cv::FileStorage::Impl::getNodePtr(unsigned long, unsigned long)

相关代码段为:

cv::FileStorage fs;
try
    fs = cv::FileStorage("someFile.yml", cv::FileStorage::READ);
catch(cv::Exception ex)

    return 1;


cv::FileNode node = fs.root();

std::cout << "Got root node" << std::endl;
std::cout << "Root node is type: " << node.type() << std::endl; //Crash here

我真的很茫然...感谢任何帮助。

编辑 1

在 opencv 论坛上,有人发现在 try/catch 块中初始化 fs 导致了这个问题。在它之外初始化它,如cv::FileStorage fs = cv::FileStorage("someFile.yml", cv::FileStorage::READ); 解决了这个问题。我仍然不知道为什么会这样......

【问题讨论】:

【参考方案1】:

正如 OpenCV Q&A 答案中所写,这个问题可以这样规避:

cv::FileStorage fs;
try
    fs.open("someFile.yml", cv::FileStorage::READ);
catch(cv::Exception ex)

    return 1;


//Do stuff with fs

我不喜欢专业的 c++ 东西(复制构造函数和东西),但可能我的问题与此有关......

【讨论】:

以上是关于OpenCV 4.2.0 FileStorage 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 机器学习函数需要 CvFileStorage* 而不是 cv::FileStorage*

OpenCV Python API 的 FileStorage

利用opencv中的类FileStorage生成和读取XML和YAML文件

Java OpenCV FileStorage 和 Mat.push_back

14 opencv读取XML

[OpenCV] Samples 10: imagelist_creator