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