OUTDATED - OpenCV的错误模式

时间:2010-02-02 06:25:16

标签: c++ c opencv

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

OpenCV有三种错误模式。

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

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

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

之前是否还有其他人看似这种行为,并且可能会推荐一个解决方案?

参考文献:

2 个答案:

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

您可以设置父模式并使用以下命令重定向错误:

cvSetErrMode(CV_ErrModeParent);
cvRedirectError(MyErrorHandler);

答案 1 :(得分:1)

在一周的服务器崩溃,从将损坏的或空的图像上传到我们的图像处理服务器,这里有一些关于我如何解决OpenCV的错误处理错综复杂的想法。我们在C ++服务器中使用V2.2。

当要加载的图像损坏(或为空)时,问题出现在cv::imread()cv::imdecode()中。通常,OpenCV只是在退出流程时会出现一些错误消息,当您运行的服务器应该始终有效时,这不是一个好主意。

https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/core/include/opencv2/core/core.hpp查看源代码我忽略了cv::setBreakOnError()的源注释中的提示,并发现以下模式有效:

cv::setBreakOnError(true); // Can be set globally
...
...
cv::Mat srcImage = cv::imread(filename, 1);
if (!srcImage.data) throw std::exception("bad image");

cv::imread()现在不会退出流程,但会将控制权传递给您自己的异常处理,因此您可以根据自己的喜好进行操作。

找到这个节省了很多心碎。