cv :: FileStorage在Qt中不起作用

时间:2013-01-20 23:21:37

标签: c++ qt opencv read-write file-storage

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

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

  

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

     

该程序意外结束。

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

N.B。这就是Qt GUI的样子:

enter image description here

用户使用相关按钮选择两个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);

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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