我有一些代码没有按预期工作。我有一个应用程序,使用imshow()来显示图像,但我也希望程序仍然工作,如果没有显示。出于这个原因,我试图从imshow(gtk -警告:不能打开显示)捕获异常,并在没有它的情况下继续程序(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 -警告",它退出程序。
那么,缺少了什么?我是否捕获了错误的错误类型?是异常实际上不是由openCV抛出,但GTK/X/?
谢谢
我不认为这些是对奇怪的cv::Exception行为的完整解释。
try {
cap = new cv::VideoCapture(<file_name>);
} catch(cv::Exception& ex) {
cerr << "opencv exception." << endl;
}
如果找不到文件,则永远不会显示我的消息,但显示以下内容:
[ERROR:0] global/data/data/com.termux/files/home/opencv4/opencv/modules/video/src/cap.cpp (142) open videoio (CV_IMAGES): raise opencv exception:
OpenCV(4.3.0-pre)/data/data/com.termux/files/home/opencv4/OpenCV/modules/video/src/CAP_IMAGES .cpp:253:错误:(-5:错误参数)CAP_IMAGES:无法找到起始编号(在文件名称中):file_name在函数'icvExtractPattern'
在这种情况下,程序在捕获异常之前被终止。我的解决方案是以下代码:
//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",它需要一些努力才能链接到适当的库。