从imshow()和namedWindow()中捕获opencv异常

时间:2016-08-06 09:53:28

标签: c++ opencv gtk imshow

我有一些代码没有按预期工作。我有一个使用imshow()来显示图像的应用程序,但我也希望程序在没有显示的情况下仍能正常工作。出于这个原因,我试图从imshow中捕获异常(GTK-Warning:无法打开显示)并在没有它的情况下继续程序(在每次imshow()调用时都会检查bool'显示')

//Display
bool display{false};
try{
    std::cout << "Attempting to open display..." << std::endl;
    cv::resize(image,modimage1,cv::Size(800,480));
    cv::namedWindow("Output", CV_WINDOW_NORMAL);
    cv::setWindowProperty("Output", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLS$
    cv::imshow("Output", modimage1);
    cv::waitKey(1);
    display = true;
} catch( cv::Exception& e ){
    const char* err_msg = e.what();
    std::cout << "exception caught:" << err_msg << std::endl;
    std::cout << "Failed to launch display, running without visual..." << s$
}

catch块是从opencv文档中复制出来的,所以我很惊讶它没有捕获到异常。该程序的行为与没有try块的行为完全相同。最后一个输出是&#34;试图打开显示&#34;然后我得到了&#34; GTK-Warning&#34;它退出程序。

那么,缺少了什么?我是否捕获了错误的错误类型?是不是openCV实际上抛出了异常,而是GTK / X /?

由于

2 个答案:

答案 0 :(得分:0)

Fyi,程序在此情况下可以捕获异常之前终止。我的解决方案是以下代码:

//Display
bool display{false};
display = gtk_init_check(NULL, NULL);
if (!display){
    std::cout << "Display unavailable, continuing without..." << std::endl;
}
if (display) {
    std::cout << "Attempting to open display..." << std::endl;
    cv::resize(image,modimage1,cv::Size(800,480));
    cv::namedWindow("Output", CV_WINDOW_NORMAL);
    cv::setWindowProperty("Output", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
    cv::imshow("Output", modimage1);
    cv::waitKey(1);
    display = true;
}

这对我来说很有效。主要的障碍是&#34; #include&#34;,它花了一些力气与相应的图书馆建立联系。

答案 1 :(得分:0)

我不认为这些是cv :: Exception异常行为的完整解释。

try {
    cap = new cv::VideoCapture(<file_name>);
} catch(cv::Exception& ex) {
    cerr << "opencv exception." << endl;
}

如果找不到该文件,则永远不会显示我的消息,但会显示以下内容:

[ERROR:0]全局/data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap.cpp(142)打开VIDEOIO(CV_IMAGES):引发了OpenCV异常:

OpenCV(4.3.0-pre)/data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap_images.cpp:253:错误:(-5:错误的参数)CAP_IMAGES :找不到起始编号(在文件名中):函数“ icvExtractPattern”中的file_name

这与X服务器无关。