2016-08-06 43 views
1

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

//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块时的行为完全相同。最后一个输出是“尝试打开显示”,然后我得到“GTK-Warning”并退出程序。

那么,缺少什么?我是否抓错了错误类型? openCV引发的异常不是真的,而是GTK/X /?

谢谢

+0

我想我找到了答案,但我有另一个线程去测试解决方案。在这种情况下,X在引发异常之前终止程序,所以异常不会被捕获。我发现的唯一解决方案是首先使用gtk_init_check()。我的问题是我无法让我的应用程序与gtk库正确链接。 – DrTarr

回答

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; 
} 

这对我来说非常合适。主要障碍是“#include”,它花费了一些努力来与适当的库链接。