如何抑制 OpenCV 错误消息

Posted

技术标签:

【中文标题】如何抑制 OpenCV 错误消息【英文标题】:How to suppress OpenCV error message 【发布时间】:2013-07-10 10:04:39 【问题描述】:

我正在使用 g++ 和 opencv 2.4.6 编写一个 OpenCV 项目

我有一些这样的代码:

try 

    H = findHomography( obj, scene, CV_RANSAC );

catch (Exception &e)

    if (showOutput)
        cout<< "Error throwed when finding homography"<<endl;
    errorCount++;
    if (errorCount >=10)
    
        errorCount = 0;
        selected_temp = -99;
        foundBB = false;
        bb_x1 = 0;
        bb_x2 = 0;
        bb_y1 = 0;
        bb_y2 = 0;
    
    return -1;

当 findHomography 找不到东西时会抛出错误。错误信息包括:

OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) 
== npoints && points1.type() == points2.type()) in findHomography, 
file /Users/dji-mini/Downloads/opencv- 2.4.6/modules/calib3d/src/fundam.cpp, 
line 1074
OpenCV Error: Assertion failed (count >= 4) in cvFindHomography, 
file /Users/dji-mini/Downloads/opencv-2.4.6/modules/calib3d/src/fundam.cpp, line 235

由于我知道消息会在什么条件下出现,所以我想禁止显示这些错误消息。但我不知道该怎么做。

在旧版本的 OpenCV 中,似乎有一个“cvSetErrMode”,根据其他文章,它在 OpenCV 2.X 中已被贬值。 那么我可以使用什么函数来抑制 OpenCV 错误消息呢?

【问题讨论】:

【参考方案1】:

cv::error() 在每次发生断言失败时被调用。默认行为是将断言语句打印到std::cerr

您可以使用未记录的cv::redirectError() 函数来设置自定义错误处理回调。这将覆盖cv::error() 的默认行为。您首先需要定义一个自定义错误处理函数:

int handleError( int status, const char* func_name,
            const char* err_msg, const char* file_name,
            int line, void* userdata )

    //Do nothing -- will suppress console output
    return 0;   //Return value is not used

然后在抛出的代码之前设置回调:

    cv::redirectError(handleError);

try 
    // Etc...

如果您希望恢复默认行为,您可以这样做:

cv::redirectError(nullptr);    //Restore default behavior; pass NULL if no C++11

【讨论】:

非常感谢!它工作得很好。你是怎么找到这个功能的? 这个函数现在被记录在here 并且可以作为cvRedirectError 使用。参见error()here的相关代码。它只会调用它而不是将其打印到 stderr,但它仍然会抛出异常。

以上是关于如何抑制 OpenCV 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yocto 中重建 OpenCV?

opencv python:Canny边缘提取

OpenCV 完整例程54. OpenCV 实现图像二维卷积

使用 OpenCV 将光栅图像转换为矢量图形?

矢量下标超出范围错误消息 3

OpenCV--边缘检测