OUTDATED - OpenCV的错误模式

Fuz*_*uzz 3 c c++ opencv

我正在使用OpenCV 1进行一些图像处理,并对cvSetErrMode函数(它是CxCore的一部分)感到困惑.

OpenCV有三种错误模式.

  • Leaf:在调用错误处理程序后终止程序.
  • 父:程序未终止,但调用错误处理程序.
  • 无声:与父模式类似,但不调用错误处理程序

在我的代码开始时,我调用cvSetErrMode(CV_ErrModeParent)从默认的'leaf'模式切换到'parent'模式,这样我的应用程序就不会因弹出异常/断言而终止.不幸的是,"父母"模式似乎不起作用.我仍然弹出消息对话框,我的应用程序仍然终止.

如果我调用cvSetErrMode(CV_ErrModeSilent)然后它实际上是静默的,不再退出应用程序或抛出一个对话框...但这也意味着我不知道发生了错误.在这种情况下,我认为模式正确设置.

有没有其他人似乎以前的这种行为,并可能能够推荐一个解决方案?

参考文献:

Fuz*_*uzz 5

我将回答我自己的问题,因为经过一些摆弄我已经解决了所发生的事情.

当您切换到"父"模式而不是叶子模式时,会有一个名为cvGuiBoxReport()的错误处理程序.cvGuiBoxReport()是默认的错误处理程序.似乎即使在父模式下,cvGuiBoxReport()仍然会终止你的应用程序!哎呀.

因此,为了解决这个问题,您可以编写自己的错误处理程序,并重定向要处理的错误,而不是终止应用程序.

示例错误处理程序:

int MyErrorHandler(int status, const char* func_name, const char* err_msg, const char* file_name, int line, void*)
{
    std::cerr << "Woohoo, my own custom error handler" << std::endl;
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

您可以设置父模式并将错误重定向到:

cvSetErrMode(CV_ErrModeParent);
cvRedirectError(MyErrorHandler);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我有类似的问题,但发现不需要调用`cvSetErrMode`.相反,我设置`cv :: redirectError(myErrorHandler)`然后通过调用`cv :: redirectError(cv :: ErrorCallback())`来解除更改. (2认同)