C++ 过时-OpenCV的错误模式

C++ 过时-OpenCV的错误模式,c++,c,opencv,C++,C,Opencv,我正在使用OpenCV 1进行一些图像处理,对cvSetErrMode函数(CxCore的一部分)感到困惑 OpenCV有三种错误模式 叶:程序在调用错误处理程序后终止 父级:程序未终止,但调用了错误处理程序 静默:类似于父模式,但不调用错误处理程序 在我的代码开始时,我调用cvSetErrMode(CV_ErrModeParent)从默认的“叶”模式切换到“父”模式,这样我的应用程序就不会因为弹出异常/断言而终止。 不幸的是,“家长”模式似乎不起作用。我仍然会弹出消息对话框,并且我的应用程

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

OpenCV有三种错误模式

  • 叶:程序在调用错误处理程序后终止
  • 父级:程序未终止,但调用了错误处理程序
  • 静默:类似于父模式,但不调用错误处理程序
在我的代码开始时,我调用cvSetErrMode(CV_ErrModeParent)从默认的“叶”模式切换到“父”模式,这样我的应用程序就不会因为弹出异常/断言而终止。 不幸的是,“家长”模式似乎不起作用。我仍然会弹出消息对话框,并且我的应用程序仍然会终止

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

有没有其他人以前有过这种行为,并且能够推荐一种解决方案

参考资料:


我要回答我自己的问题,因为经过一番周旋之后,我已经知道了会发生什么

当您切换到“父”模式而不是叶模式时,会出现一个名为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;
} 

在一周的时间里,由于将损坏的或空的图像上传到我们的图像处理服务器而导致服务器崩溃,下面是我如何解决OpenCV复杂的错误处理问题的一些想法。我们在VC++中使用V2.2。 当要加载的图像损坏(或为空)时,问题出现在
cv::imread()
cv::imdecode()
中。通常情况下,OpenCV只是带着一些错误消息退出流程,当您运行一个应该一直工作的服务器时,这不是一个好主意

在查看源代码时,我忽略了
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()
现在不会退出该进程,而是将控制权传递给您自己的异常处理,因此您可以随心所欲地处理它


发现这一点节省了很多心碎。

谢谢,我也遇到了类似的问题,但发现
cvSetErrMode
不需要调用。相反,我设置了
cv::redirectError(myErrorHandler)
,然后调用
cv::redirectError(cv::ErrorCallback())
,取消了更改。嗨@Fuzz,-编辑一个4年前的问题可能是个糟糕的主意,因为这个主题(以及ole c-api)今天已经不再相关了。fair comment@berak。最近有人把它选为+1,所以一定读过了。我重读了一遍,注意到了错误,情不自禁。
cv::setBreakOnError(true); // Can be set globally
...
...
cv::Mat srcImage = cv::imread(filename, 1);
if (!srcImage.data) throw std::exception("bad image");