Matt23488

Display IplImage with gtk+

May 19th, 2011
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. #include <windows.h>
  2. #include <gtk/gtk.h>
  3. #include "opencv.hpp"
  4.  
  5. int main( int argc, char **argv );
  6.  
  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  8. {
  9.   return main (__argc, __argv);
  10. }
  11.  
  12. /***********************************
  13.          GLOBAL VARIABLES
  14. ***********************************/
  15.  
  16. gboolean popup = FALSE;
  17.  
  18. /***********************************
  19.        FUNCTION DECLARATIONS
  20. ***********************************/
  21.  
  22. GdkPixbuf* convertOpenCvToGtk(IplImage *image); //Converts an OpenCV image to a GDK pixel buffer
  23.  
  24. /***********************************
  25.            EVENT HANDLERS
  26. ***********************************/
  27.  
  28. void
  29. popupDestroyed (GtkWindow *window, gpointer user_data)
  30. {
  31.     GtkWidget **Widgets;
  32.     Widgets = (GtkWidget**)user_data;
  33.  
  34.     gtk_widget_destroy (Widgets[0]);
  35.     gtk_widget_destroy (Widgets[1]);
  36.     gtk_widget_destroy (GTK_WIDGET (window));
  37.  
  38.     popup = FALSE;
  39. }
  40.  
  41. void
  42. buttonPopup_clicked (GtkButton *button, gpointer user_data)
  43. {
  44.     GtkEntry *entry;
  45.     entry = GTK_ENTRY (user_data);
  46.  
  47.     if(!popup)
  48.     {
  49.         IplImage *cvImage;
  50.         cvImage = cvLoadImage(gtk_entry_get_text(entry));
  51.  
  52.         if(cvImage == NULL)
  53.         {
  54.             GtkWidget *dialog;
  55.             dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error loading image \"%s\"", gtk_entry_get_text (entry));
  56.  
  57.             gtk_dialog_run (GTK_DIALOG (dialog));
  58.             gtk_widget_destroy (dialog);
  59.  
  60.             return;
  61.         }
  62.  
  63.         GdkPixbuf *pix;
  64.         pix = convertOpenCvToGtk(cvImage);
  65.  
  66.         GtkWidget *image;
  67.         image = gtk_image_new_from_pixbuf (pix);
  68.  
  69.         gtk_widget_destroy (GTK_WIDGET (pix));
  70.  
  71.         GtkWidget *window;
  72.         GtkWidget *vbox;
  73.  
  74.         GtkWidget **widgetArray = new GtkWidget*[2];
  75.  
  76.         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  77.         gtk_window_set_title (GTK_WINDOW (window), gtk_entry_get_text (entry));
  78.         vbox = gtk_vbox_new (FALSE, 6);
  79.         gtk_container_add (GTK_CONTAINER (window), vbox);
  80.         gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
  81.        
  82.         widgetArray[0] = image;
  83.         widgetArray[1] = vbox;
  84.        
  85.         g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), (gpointer)widgetArray);
  86.  
  87.         gtk_widget_show_all (window);
  88.         popup = TRUE;
  89.     }
  90. }
  91.  
  92. /***********************************
  93.             ENTRY POINT
  94. ***********************************/
  95.  
  96. int main (int argc, char **argv)
  97. {
  98.     //Variable declarations
  99.     GtkWidget *window;
  100.     GtkWidget *vbox;
  101.     GtkWidget *hbox;
  102.     GtkWidget *buttonPopup;
  103.     GtkWidget *entry;
  104.  
  105.     //Call this before setting up widgets, etc
  106.     gtk_init (&argc, &argv);
  107.  
  108.  
  109.  
  110.     //Variable initializations
  111.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  112.     gtk_window_set_title (GTK_WINDOW (window), "Main Window");
  113.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 100);
  114.  
  115.     vbox = gtk_vbox_new (TRUE, 6);
  116.     hbox = gtk_hbox_new (TRUE, 6);
  117.  
  118.     buttonPopup = gtk_button_new_with_label ("Show Image");
  119.  
  120.     entry = gtk_entry_new ();
  121.     gtk_entry_set_text (GTK_ENTRY (entry), "picture.png");
  122.  
  123.     //Event handler hookups
  124.     g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
  125.     g_signal_connect (G_OBJECT (buttonPopup), "clicked", G_CALLBACK (buttonPopup_clicked), (gpointer)entry);
  126.  
  127.     //GUI assemblage
  128.     gtk_container_add (GTK_CONTAINER (window), vbox);
  129.  
  130.     gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 6);
  131.     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6);
  132.     gtk_box_pack_start (GTK_BOX (hbox), buttonPopup, FALSE, FALSE, 6);
  133.  
  134.     //Show the GUI elements
  135.     gtk_widget_show_all (window);
  136.  
  137.  
  138.  
  139.  
  140.     //Call this AFTER setting up widgets etc
  141.     gtk_main ();
  142.  
  143.     return 0;
  144. }
  145.  
  146. /***********************************
  147.         FUNCTION DEFINITIONS
  148. ***********************************/
  149.  
  150. GdkPixbuf* convertOpenCvToGtk(IplImage *image)
  151. {
  152.     IplImage *gtkMask;
  153.     //GtkWidget *gtkImg;
  154.     GdkPixbuf *pix;
  155.  
  156.     gtkMask = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);//Create another image with the same stuff
  157.     cvCvtColor(image, gtkMask, CV_BGR2RGB);//Copy the IplImage to RGB format
  158.     //Copy the IplImage data to a GdkPixbuf:
  159.     pix = gdk_pixbuf_new_from_data (
  160.         (guchar*)gtkMask->imageData,//Raw image data
  161.         GDK_COLORSPACE_RGB,         //Colorspace
  162.         FALSE,                      //Has alpha channel or not
  163.         gtkMask->depth,             //Bits per pixel
  164.         gtkMask->width,             //Width of image
  165.         gtkMask->height,            //Height of image
  166.         gtkMask->widthStep,         //Row stride
  167.         NULL,                       //Not sure what this is
  168.         NULL                        //Not sure what this is
  169.     );
  170.     //gtkImg = gtk_image_new_from_pixbuf (pix);
  171.     return pix;//Uncomment the gtkImg lines, change the return type to GtkWidget* and return gtkImg to make this return a GtkImage instead of a GdkPixbuf
  172. }
Advertisement
Add Comment
Please, Sign In to add comment