C++ 无法处理cv::imshow gtk警告
在无头测试机(Travis CI)上,当使用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
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 (...)