捕获来自imshow()和namedWindow()的opencv异常

Catching opencv exception from imshow() and namedWindow()

本文关键字:namedWindow opencv 异常 imshow      更新时间:2023-10-16

我有一些代码没有按预期工作。我有一个应用程序,使用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",它需要一些努力才能链接到适当的库。