【问题标题】:Getting opencv error in c++在 C++ 中获取 opencv 错误
【发布时间】:2013-10-21 07:36:36
【问题描述】:

我试图得到opencv的错误!说我有这个程序:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

int main (){
    cv::Mat frame;
    cv::VideoCapture cap(1); // I don't have a second videoinput device! 
    int key = 0; 

    while(key !=27){
        cap >> frame;
        cv::imshow("frame",frame);
        key = cv::waitKey(10);
    }

    cap.release();
    return 0;
}

当我运行这个程序时,我会在控制台中看到这条消息:

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in unknown functi
on, file ..\..\..\opencv\modules\highgui\src\window.cpp, line 261

我的问题是如何获取此消息并将其保存在字符串中以处理我收到的每个错误! 如果有可能逃脱程序崩溃!

提前致谢!

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    它使用 C++ 异常。有关更多信息,请参阅文档中的 here

    try
    {
        ... // call OpenCV
    }
    catch( cv::Exception& e )
    {
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    }
    

    OpenCV 代码中的CV_Assert 是一个宏,它调用OpenCV 函数error。该功能可以看到here。除非您没有设置 customErrorCallback,否则它将始终在 stderr 上打印错误文本。您可以通过cvRedirectError 执行此操作,请参阅here

    【讨论】:

    • 感谢您的回答!它有效,是否有禁用下面错误消息的输出?
    • 只需删除std::cout?你可以把它放在一个文件中。
    • 不,它不起作用!输出发生在 cv::imshow() 因为框架指向 NULL 值
    • @Engine:您可以通过cvRedirectError 做到这一点。我扩展了我的答案。
    • @Albert 嘿,我的 cvWriteFrame 例程返回 0(这意味着它失败了,我观察到当我实际上能够编写视频时它返回 1)。但是,我需要提取详细的错误消息。它没有引发异常,并尝试从命令行本身将stderr 重定向到stdout,但没有成功。你能帮我在PyOpenCV中使用cvRedirectError吗?文档没有帮助!
    【解决方案2】:

    您必须检查代码中的 OpenCV 函数调用是否成功执行。然后你就可以理解确切的问题了。这是修改后的代码。

    int main (){
        cv::Mat frame;
        cv::VideoCapture cap(1); // I don't have a second videoinput device! 
    
        if ( !cap.isOpened() )  // if not success, exit program
        {
             cout << "Cannot open the video cam" << endl;
             return -1;
        }
    
        int key = 0; 
    
        while(key !=27){
            bool bSuccess = cap.read(frame); // read a new frame from video
    
             if (!bSuccess) //if not success, break loop
            {
                cout << "Cannot read the frame from video cam" << endl;
                break;
            }
            cv::imshow("frame",frame);
            key = cv::waitKey(10);
        }
    
        cap.release();
        return 0;
    }
    

    【讨论】:

    • 问题不是让程序运行,而是有办法保存 opencv 错误消息
    猜你喜欢
    • 2016-11-27
    • 2018-05-08
    • 2012-07-28
    • 2019-02-01
    • 2016-02-23
    • 1970-01-01
    • 2014-01-11
    • 2012-02-11
    • 2015-06-21
    相关资源
    最近更新 更多