我有一些代码没有按预期工作。我有一个使用imshow()来显示图像的应用程序,但我也希望程序在没有显示的情况下仍能正常工作。出于这个原因,我试图从imshow中捕获异常(GTK-Warning:无法打开显示)并在没有它的情况下继续程序(在每次imshow()调用时都会检查bool'显示')
//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块的行为完全相同。最后一个输出是&#34;试图打开显示&#34;然后我得到了&#34; GTK-Warning&#34;它退出程序。
那么,缺少了什么?我是否捕获了错误的错误类型?是不是openCV实际上抛出了异常,而是GTK / X /?
由于
答案 0 :(得分: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;
}
这对我来说很有效。主要的障碍是&#34; #include&#34;,它花了一些力气与相应的图书馆建立联系。
答案 1 :(得分:0)
我不认为这些是cv :: Exception异常行为的完整解释。
try {
cap = new cv::VideoCapture(<file_name>);
} catch(cv::Exception& ex) {
cerr << "opencv exception." << endl;
}
如果找不到该文件,则永远不会显示我的消息,但会显示以下内容:
[ERROR:0]全局/data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap.cpp(142)打开VIDEOIO(CV_IMAGES):引发了OpenCV异常:>
OpenCV(4.3.0-pre)/data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap_images.cpp:253:错误:(-5:错误的参数)CAP_IMAGES :找不到起始编号(在文件名中):函数“ icvExtractPattern”中的file_name
这与X服务器无关。