1

我有一个我在 Xcode 中编写的命令行 openCV 程序,它打开两个 XML 文件,分析然后比较它们。但是,我现在尝试使用 QtCreator 将该程序放入 GUI 中,以便更容易理解输出。

问题是,Qt 似乎不喜欢 cv::FileStorage。程序编译得很好,但是当我真正尝试执行 OpenCV 部分时,它崩溃了,给出了这个错误:

OpenCV 错误:cvOpenFileStorage 中的空指针(NULL 或空缓冲区),文件 /tmp/OpenCV-2.4.3/modules/core/src/persistence.cpp,第 2702 行 Qt 已捕获从事件处理程序引发的异常。Qt 不支持从事件处理程序中抛出异常。您必须重新实现 QApplication::notify() 并在那里捕获所有异常。

程序意外结束。

有谁知道为什么 Qt 似乎不喜欢运行这个程序?或者,如果有一种方法可以将 OpenCV 程序干净地集成到 Qt 中?

注意这是 Qt GUI 的样子:

在此处输入图像描述

用户使用相关按钮选择两个 XML 文件。然后将这些文件的路径存储并显示在按钮旁边的框中。然后,我使用以下命令将 QStrings 转换为 std::strings:

std::string file1path = file1Name.toUtf8().constData();
std::string file2path = file2Name.toUtf8().constData();

然后将 file1path 和 file2path 传递给 cv::FileStorage 命令,如下所示:

//Create File Storage
FileStorage storage1;
storage1.open(file1path, FileStorage::READ);

FileStorage storage2;
storage2.open(file2path, FileStorage::READ);
4

2 回答 2

0

它不是专门针对 Qt 的。
OpenCV 在您使用 fileStorage 时抛出错误,文件不存在,不可读,或者您试图读取错误的类型。

Qt 给你这个错误是因为异常已经到达它的一般错误处理程序,用于未经检查的异常而不是 openCv,它会打印一个更有用的错误。

您可以通过向 QApplication 添加方法来向 Qt 应用程序添加全局异常处理程序

bool QApplication::notify ( QObject * receiver, QEvent * event )
    {
      try{
        return QApplication::notify( received, event );
      }
      catch ( const std::exception &e )
      {
        QApplication::postEvent( this, new MyEvent( e.what() );
      }
      catch ( ... )
      {

      }

另见http://qt-project.org/doc/qt-4.8/exceptionsafety.html

于 2013-01-20T23:40:52.580 回答
-1

如果您使用它,请尝试将“”替换为“/”

于 2021-08-11T01:33:04.963 回答