Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

display opencv cv::Mat image in gtkmm

I want to display a cv::Mat in a Gui written by gtkmm. So I have done a test.

I have a widget Gtk::Image image, and I want to set the image with the following two methods:

// first method, display from file
void displayImage1()
{
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_file("gtk.png");
    image.set(pixbuf);
}

// second method, display from cv::Mat
void displayImage2()
{
    cv::Mat outImage = cv::imread("gtk.png");
    cv::cvtColor(outImage, outImage, CV_BGR2RGB);
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(outImage.data, Gdk::COLORSPACE_RGB,false, 8, outImage.cols, outImage.rows, outImage.step);
    image.set(pixbuf);
}

The first method works well.

enter image description here

However, the second method doesn't work well, I got a destroyed image on the screen as shown in the picture.

enter image description here

If I set the has_alpha parameter to true, the result is also strange (see pic. below). enter image description here

Similar tests were done by using Gtk::DrawingArea. Different IDEs are used (but all g++ compiler under linux). All same results.

Update:

I tested lots of images. Sometimes the images are broken, sometimes the programs crashed with

The program has unexpectedly finished.

like image 575
Summer Fang Avatar asked Oct 18 '25 10:10

Summer Fang


2 Answers

try add a reference to outimage, like outimage.addref() . all my problems were related to that. the source image being de-referenced before the gdk_pixbuf_new_from_data get a chance to map it. leading to segfaults, corruption and so on. just be sure to release it later, or use the callback provided with gdk_pixbuf_new_from_data

like image 108
ERic Avatar answered Oct 20 '25 01:10

ERic


For Gtkmm-2.4 and OpenCv 4.6 check https://onthim.blogspot.com/2015/10/using-opencv-in-gtk-applications.html and https://developer-old.gnome.org/gtkmm-tutorial/2.24/sec-draw-images.html.es

    Mat frame;
    frame = imread("gtk.png");    
    cv::cvtColor (frame, frame, COLOR_BGR2RGB);//COLOR_BGR2GRAY
    Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_data(frame.data,Gdk::COLORSPACE_RGB, false, 8, frame.cols, frame.rows, frame.step);
    image->render_to_drawable(get_window(), get_style()->get_black_gc(),0, 0, 0, 0, image->get_width(), image->get_height(), // draw the whole image (from 0,0 to the full width,height) at 100,80 in the window
Gdk::RGB_DITHER_NONE, 0, 0);
like image 32
Gelberth Amarillo Rojas Avatar answered Oct 20 '25 01:10

Gelberth Amarillo Rojas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!