从opencv读取时gtkmm DrawingArea分段错误

Posted

技术标签:

【中文标题】从opencv读取时gtkmm DrawingArea分段错误【英文标题】:gtkmm DrawingArea segmentation fault when reading from opencv 【发布时间】:2017-02-24 19:39:33 【问题描述】:

我正在使用 gtkmm 3 开发一个简单的 OpenCV (v3.1) 视频捕获应用程序,现在我正在尝试通过将 Mat 对象加载到 DrawingAreaCairo::Context。程序如下:

int main(int argc, char *argv[])
    Gtk::Window* mainWindow;
    Gtk::DrawingArea* videoBackground; 
    auto app = Gtk::Application::create(argc, argv, "com.twallis.OSD");

    Mat inImage, outImage;
    inImage = cv::imread("blackbackground.jpg", IMREAD_COLOR);
    cvtColor(inImage, outImage, CV_BGR2RGB);

    /*LOAD WIDGETS FROM BUILDER FILE*/
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
    try
        builder->add_from_file("OSD_drawing_background1.glade");    
    
    catch(const Glib::FileError& ex)
        std::cerr << "fileError: " << ex.what() << endl;
        return 1;
    
    catch(const Glib::MarkupError& ex)
        std::cerr << "MarkupError: " << ex.what() << endl;
        return 1;
    
    catch(const Gtk::BuilderError& ex)
        std::cerr << "BuilderError " << ex.what() << endl;
        return 1;
    

    builder->get_widget("mainWindow", mainWindow);
    builder->get_widget("videoBackground", videoBackground);

    Cairo::RefPtr<Cairo::Context> cairoContext = videoBackground-  >get_window()->create_cairo_context();
    Gdk::Cairo::set_source_pixbuf(cairoContext,    Gdk::Pixbuf::create_from_data(outImage.data, Gdk::COLORSPACE_RGB, false, 8, outImage.cols, outImage.rows, outImage.step));

    mainWindow->add(*videoBackground);
    videoBackground->queue_draw();

    return app->run(*mainWindow);   

当我编译程序时使用:g++ -std=c++11 -Wall -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib -g OSDDrawingWindow.cpp -o drawing -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs pkg-config gtkmm-3.0 gtk+-3.0 --cflags --libs

我没有收到任何警告,但立即运行程序会导致段错误。这是为什么呢?

【问题讨论】:

【参考方案1】:
if(!outImage.empty()) 
   ...

【讨论】:

虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案没有用处。

以上是关于从opencv读取时gtkmm DrawingArea分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为 gtk、gtkmm 和 opencv 更正 CMakeLists.txt 文件

从文件中读取视频时opencv的分段错误

使用 Eclipse 从 OpenCV-3.1 读取时出错

从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频

Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵