C++ 无法处理cv::imshow gtk警告

C++ 无法处理cv::imshow gtk警告,c++,opencv,gtk,travis-ci,highgui,C++,Opencv,Gtk,Travis Ci,Highgui,在无头测试机(Travis CI)上,当使用cv::imshow时,我得到一个程序崩溃并显示: Gtk-WARNING **: cannot open display: 这个信息似乎很正常。 但是我不能成功地抓住错误 我试过使用该代码: try { // create a window for display. cv::namedWindow( name, CV_WINDOW_AUTOSIZE ); // Show our im

在无头测试机(Travis CI)上,当使用
cv::imshow
时,我得到一个程序崩溃并显示:

Gtk-WARNING **: cannot open display: 
这个信息似乎很正常。 但是我不能成功地抓住错误

我试过使用该代码:

    try
    {
        // create a window for display.
        cv::namedWindow( name, CV_WINDOW_AUTOSIZE );
        // Show our image inside it.
        cv::imshow( name, img );

        // take time to effectively display the image
        cv::waitKey(1000);
    }
    catch (cv::Exception& e)
    {
        std::cout << "OpenCV GUI not able to pop up: " << e.what() << 
                "\nProbably executing on a headless test machine? " << std::endl;
    }
没有成功

任何帮助都会。。。救命啊

多谢各位


编辑: 我在这里找到了一个解决方法:
使用xvfb以避免
cv::imshow
(或
cv::namedWindow
)引发“无显示”错误。。。事实上,它并不能真正解决我无法捕捉GTK错误的问题。

GTK+不抛出C++异常。我们需要看到更多的代码。谢谢@andlabs。好的,那么openCV highGui使用gtk+的方式似乎不允许捕捉错误。我的代码封装在一些poco(pocoproject.org)线程工具中。我从一些poco报告中得到了错误,但我不知道真正的时间和方式,因为线程也可能是由openCV或gtk+本身创建的(?)如果您对捕获gtk+记录器消息感兴趣,可以在
g_logv()
函数上设置断点,该函数是GLib日志系统的入口点。在某些情况下,如
gtk_init()
(这就是特定消息的来源),如果OpenCV想要返回错误对象并抛出该对象,则可以调用该函数的另一个版本;我猜它选择不这样做。至于“无法打开显示”,GTK+正在尝试连接到X11,但无法连接(因为您的测试环境是无头的)。不知道该怎么办…好的,非常感谢你的精确性。伟大的
catch (...)