У меня есть код, который не работает, как задумано. У меня есть приложение, которое использует imshow () для отображения изображения, но я также хочу, чтобы программа все еще работала, если нет отображения. По этой причине я пытаюсь поймать исключение из imshow (GTK-Warning: не могу открыть дисплей) и продолжить программу без него (bool ‘display’ проверяется при каждом вызове imshow ()).
//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 /?
Спасибо
Кстати, программа закрывается, прежде чем вы сможете поймать исключение в этом случае. Моим решением был следующий код:
//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», который приложил некоторые усилия, чтобы установить связь с соответствующими библиотеками.
Других решений пока нет …