从 imshow() 和 namedWindow() 捕获 opencv 异常

Catching opencv exception from imshow() and namedWindow()

我有一些代码没有按预期工作。我有一个使用 imshow() 来显示图像的应用程序,但我也希望该程序在没有显示的情况下仍然可以工作。出于这个原因,我试图从 imshow 中捕获异常(GTK-警告:无法打开显示)并在没有它的情况下继续程序(在每次 imshow() 调用时检查 bool 'display')。

//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 块时完全一样。最后的输出是 "Attempting to open display" 然后我得到 "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”,它需要一些努力才能使用适当的库link。

我不认为这些是对奇怪 cv::Exception 行为的完整解释。

try {
    cap = new cv::VideoCapture(<file_name>);
} catch(cv::Exception& ex) {
    cerr << "opencv exception." << endl;
}

如果找不到文件,则不会显示我的消息,但会显示以下内容:

[错误:0] 全局 /data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap.cpp (142) 打开视频 (CV_IMAGES): 引发 OpenCV 异常:

OpenCV(4.3.0-pre) /data/data/com.termux/files/home/opencv4/opencv/modules/videoio/src/cap_images.cpp:253: 错误: (-5:Bad argument) CAP_IMAGES: 不能查找起始编号(在文件名中):file_name 在函数 'icvExtractPattern'

这与 X 服务器无关。