Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <gtk/gtk.h>
- #include "opencv.hpp"
- int main( int argc, char **argv );
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
- {
- return main (__argc, __argv);
- }
- #define MAX_SPEED 33
- #define CV_CAPTURE(obj) (CvCapture*)obj
- /***********************************
- GLOBAL VARIABLES
- ***********************************/
- gboolean popup = FALSE;
- cairo_surface_t *image;
- int frame_num = 1;
- IplImage *frame;
- IplImage *frameNew;
- gboolean playing = FALSE;
- gboolean first_play = TRUE;
- /***********************************
- FUNCTION DECLARATIONS
- ***********************************/
- GdkPixbuf* convert_open_cv_to_gtk(IplImage *image); //Converts an OpenCV image to a GDK pixel buffer
- gboolean grab_frames(gpointer data);
- void fix_alpha(IplImage *src);
- /***********************************
- EVENT HANDLERS
- ***********************************/
- void
- popupDestroyed (GtkWindow *window, gpointer user_data)
- {
- if(user_data != NULL)
- {
- CvCapture *video;
- video = CV_CAPTURE (user_data);
- if(cvGrabFrame(video))
- {
- g_print ("Video was interrupted...\n");
- }
- cvReleaseCapture (&video);
- //cvReleaseImage (&frame);
- //cvReleaseImage (&frameNew);
- frame_num = 1;
- playing = FALSE;
- first_play = FALSE;
- }
- gtk_widget_destroy (GTK_WIDGET (window));
- popup = FALSE;
- }
- void
- buttonShowImg_clicked (GtkButton *button, gpointer user_data)
- {
- GtkEntry *entry;
- entry = GTK_ENTRY (user_data);
- if(!popup)
- {
- IplImage *cvImage;
- cvImage = cvLoadImage(gtk_entry_get_text(entry));
- if(cvImage == NULL)
- {
- GtkWidget *dialog;
- 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));
- //gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), GTK_WIDGET (gtk_image_new_from_pixbuf (convert_open_cv_to_gtk(cvLoadImage("picture.png")))));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
- GdkPixbuf *pix;
- pix = convert_open_cv_to_gtk(cvImage);
- GtkWidget *image;
- image = gtk_image_new_from_pixbuf (pix);
- GtkWidget *window;
- GtkWidget *vbox;
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), gtk_entry_get_text (entry));
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
- g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), NULL);
- gtk_widget_show_all (window);
- popup = TRUE;
- }
- }
- gboolean
- expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
- {
- cairo_t *cr;
- cr = gdk_cairo_create (widget->window);
- cairo_set_source_surface (cr, image, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
- return TRUE;
- }
- void
- buttonShowVid_clicked (GtkButton *button, gpointer user_data)
- {
- if(popup)
- {
- return;
- }
- GtkEntry *entry;
- entry = GTK_ENTRY (user_data);
- CvCapture *video;
- video = cvCreateFileCapture (gtk_entry_get_text (entry));
- if(video == NULL)
- {
- GtkWidget *errDialog;
- errDialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error loading video \"%s\"", gtk_entry_get_text (entry));
- gtk_dialog_run (GTK_DIALOG (errDialog));
- gtk_widget_destroy (errDialog);
- return;
- }
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *draw;
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- vbox = gtk_vbox_new (FALSE, 0);
- draw = gtk_drawing_area_new ();
- gtk_window_set_default_size (GTK_WINDOW (window), cvQueryFrame(video)->width, cvQueryFrame(video)->height);
- gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
- gtk_widget_set_size_request (draw, cvQueryFrame(video)->width, cvQueryFrame(video)->height);
- gpointer *stuff;
- stuff = new gpointer[2];
- stuff[0] = (gpointer)video;
- stuff[1] = (gpointer)draw;
- playing = TRUE;
- g_timeout_add (MAX_SPEED, grab_frames, (gpointer)stuff);
- g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), (gpointer)video);
- g_signal_connect (G_OBJECT (draw), "expose-event", G_CALLBACK (expose_event_callback), NULL);
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox), draw, FALSE, FALSE, 0);
- gtk_widget_show_all (window);
- popup = TRUE;
- }
- void
- scan_mode_button_pressed (GtkButton *button, gpointer user_data_unused)
- {
- GtkWidget *dialog;
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "You pressed the %s button", gtk_button_get_label (button));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
- void
- scan_mode_window_show (GtkButton *button, gpointer user_data_unused)
- {
- if(popup)
- {
- return;
- }
- //Declarations
- //Containers/Boxes Declared in Tree Form
- GtkWidget *window;
- GtkWidget *vboxMain;
- GtkWidget *hboxMenu;
- GtkWidget *hboxTopButtons;
- GtkWidget *hboxTopImages;
- GtkWidget *hboxBot;
- GtkWidget *vboxBot1;
- GtkWidget *hboxVboxBot11;
- GtkWidget *hboxVboxBot12;
- GtkWidget *vboxBot2;
- GtkWidget *hboxVboxBot21;
- GtkWidget *hboxVboxBot22;
- GtkWidget *vboxBot3;
- GtkWidget *vboxVboxBot31;
- GtkWidget *hboxPath;
- GtkWidget *hboxResolution;
- GtkWidget *hboxSteps;
- GtkWidget *vboxVboxBot32;
- //Other Widgets
- GtkWidget *menuBar;
- GtkWidget *fileMenuItem;
- GtkWidget *fileMenu;
- GtkWidget *quitMenuItem;
- GtkWidget *saveButton;
- GtkWidget *calibrateButton;
- GtkWidget *scanButton;
- GtkWidget *restoreButton;
- GtkWidget *cam1;
- GtkWidget *cam2;
- GtkWidget *cam3;
- GtkWidget *image4;
- GtkWidget *image5;
- GtkWidget *pathLabel;
- GtkWidget *resolutionLabel;
- GtkWidget *stepsLabel;
- GtkWidget *pathEntry;
- GtkWidget *resolutionEntry;
- GtkWidget *stepsEntry;
- GtkWidget *hscale1;
- GtkWidget *hscale2;
- GtkWidget *hscale3;
- //Video
- CvCapture *video;
- video = cvCreateFileCapture ("boucing_ball.divx");
- //Initializations
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- vboxMain = gtk_vbox_new (FALSE, 6);
- //hboxMenu = gtk_hbox_new (FALSE, 6);
- hboxTopButtons = gtk_hbox_new (FALSE, 6);
- hboxTopImages = gtk_hbox_new (FALSE, 6);
- hboxBot = gtk_hbox_new (FALSE, 6);
- vboxBot1 = gtk_vbox_new (FALSE, 6);
- hboxVboxBot11 = gtk_hbox_new (FALSE, 6);
- hboxVboxBot12 = gtk_hbox_new (FALSE, 6);
- vboxBot2 = gtk_vbox_new (FALSE, 6);
- hboxVboxBot21 = gtk_hbox_new (FALSE, 6);
- hboxVboxBot22 = gtk_hbox_new (FALSE, 6);
- vboxBot3 = gtk_vbox_new (FALSE, 6);
- vboxVboxBot31 = gtk_vbox_new (FALSE, 6);
- vboxVboxBot32 = gtk_vbox_new (FALSE, 6);
- hboxPath = gtk_hbox_new (FALSE, 6);
- hboxResolution = gtk_hbox_new (FALSE, 6);
- hboxSteps = gtk_hbox_new (FALSE, 6);
- menuBar = gtk_menu_bar_new ();
- fileMenuItem = gtk_menu_item_new ();
- fileMenu = gtk_menu_new ();
- quitMenuItem = gtk_menu_item_new ();
- saveButton = gtk_button_new_with_label ("Save");
- calibrateButton = gtk_button_new_with_label ("Calibrate");
- scanButton = gtk_button_new_with_label ("Scan");
- restoreButton = gtk_button_new_with_label ("Restore");
- cam1 = gtk_image_new_from_file ("picture2.png");
- //cam1 = gtk_drawing_area_new ();
- cam2 = gtk_image_new_from_file ("picture2.png");
- cam3 = gtk_image_new_from_file ("picture2.png");
- image4 = gtk_image_new_from_file ("picture2.png");
- image5 = gtk_image_new_from_file ("picture2.png");
- pathLabel = gtk_label_new ("Path:");
- resolutionLabel = gtk_label_new ("Resolution:");
- stepsLabel = gtk_label_new ("Steps:");
- pathEntry = gtk_entry_new ();
- resolutionEntry = gtk_entry_new();
- stepsEntry = gtk_entry_new();
- hscale1 = gtk_hscale_new_with_range (0.0, 10.0, 1.0);
- hscale2 = gtk_hscale_new_with_range (0.0, 10.0, 0.1);
- hscale3 = gtk_hscale_new_with_range (0.0, 10.0, 0.01);
- //Extra Initializations
- gtk_window_set_title (GTK_WINDOW (window), "Scan Mode");
- gtk_menu_item_set_label (GTK_MENU_ITEM (fileMenuItem), "File");
- gtk_menu_item_set_label (GTK_MENU_ITEM (quitMenuItem), "Quit");
- //gtk_menu_set_title (GTK_MENU (fileMenu), "File");
- //gtk_widget_set_size_request (cam1, 640, 480);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (fileMenuItem), fileMenu);
- gtk_menu_shell_append (GTK_MENU_SHELL (fileMenu), quitMenuItem);
- gtk_menu_shell_append (GTK_MENU_SHELL (menuBar), fileMenuItem);
- //Set up data for the timer
- //gpointer *stuff;
- //stuff = new gpointer[2];
- //stuff[0] = (gpointer)video;
- //stuff[1] = (gpointer)cam1;
- //G Timer
- //g_timeout_add (MAX_SPEED, grab_frames, (gpointer)stuff);
- //Event Handler Hookups
- g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), (gpointer)video);
- g_signal_connect (G_OBJECT (quitMenuItem), "activate", G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (saveButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
- g_signal_connect (G_OBJECT (calibrateButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
- g_signal_connect (G_OBJECT (scanButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
- g_signal_connect (G_OBJECT (restoreButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
- //g_signal_connect (G_OBJECT (cam1), "expose-event", G_CALLBACK (expose_event_callback), NULL);
- //GUI Assemblage
- gtk_container_add (GTK_CONTAINER (window), vboxMain);
- gtk_box_pack_start (GTK_BOX (vboxMain), /*hboxMenu*/menuBar, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxMain), hboxTopButtons, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxMain), hboxTopImages, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxMain), hboxBot, FALSE, FALSE, 6);
- //gtk_box_pack_start (GTK_BOX(hboxMenu), menuBar, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopButtons), saveButton, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopButtons), calibrateButton, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopButtons), scanButton, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopImages), cam1, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopImages), cam2, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxTopImages), cam3, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot1, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot2, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot3, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot1), hboxVboxBot11, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot1), hboxVboxBot12, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxVboxBot11), image4, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxVboxBot12), restoreButton, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot2), hboxVboxBot21, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot2), hboxVboxBot22, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxVboxBot21), image5, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot3), vboxVboxBot31, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxBot3), vboxVboxBot32, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxPath, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxResolution, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxSteps, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (hboxPath), pathLabel, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxPath), pathEntry, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (hboxResolution), resolutionLabel, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxResolution), resolutionEntry, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (hboxSteps), stepsLabel, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hboxSteps), stepsEntry, TRUE, TRUE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale1, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale2, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale3, FALSE, FALSE, 6);
- //Show the GUI
- gtk_widget_show_all (window);
- popup = TRUE;
- }
- /***********************************
- ENTRY POINT
- ***********************************/
- int main (int argc, char **argv)
- {
- //Variable declarations
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *hbox2;
- GtkWidget *hbox3;
- GtkWidget *buttonShowImg;
- GtkWidget *buttonShowVid;
- GtkWidget *buttonScan;
- GtkWidget *entry;
- //Call this before setting up widgets, etc
- gtk_init (&argc, &argv);
- //Variable initializations
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "Main Window");
- gtk_window_set_default_size (GTK_WINDOW (window), 300, 100);
- gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER_ON_PARENT);
- vbox = gtk_vbox_new (TRUE, 6);
- hbox = gtk_hbox_new (TRUE, 6);
- hbox2 = gtk_hbox_new (TRUE, 6);
- hbox3 = gtk_hbox_new (TRUE, 6);
- buttonShowImg = gtk_button_new_with_label ("Show Image");
- buttonShowVid = gtk_button_new_with_label ("Show Video");
- buttonScan = gtk_button_new_with_label ("Scan Mode");
- entry = gtk_entry_new ();
- gtk_entry_set_text (GTK_ENTRY (entry), "bouncing_ball.divx");//"bouncing_ball.divx"/*"picture.png"*/);
- //Event handler hookups
- g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (buttonShowImg), "clicked", G_CALLBACK (buttonShowImg_clicked), (gpointer)entry);
- g_signal_connect (G_OBJECT (buttonShowVid), "clicked", G_CALLBACK (buttonShowVid_clicked), (gpointer)entry);
- g_signal_connect (G_OBJECT (buttonScan), "clicked", G_CALLBACK (scan_mode_window_show), NULL);
- //GUI assemblage
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (vbox), hbox3, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox), buttonShowImg, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox2), buttonShowVid, FALSE, FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox3), buttonScan, FALSE, FALSE, 6);
- //Show the GUI elements
- gtk_widget_show_all (window);
- //Call this AFTER setting up widgets etc
- gtk_main ();
- return 0;
- }
- /***********************************
- FUNCTION DEFINITIONS
- ***********************************/
- GdkPixbuf* convert_open_cv_to_gtk(IplImage *image)
- {
- IplImage *gtkMask;
- //GtkWidget *gtkImg;
- GdkPixbuf *pix;
- gtkMask = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);//Create another image with the same stuff
- cvCvtColor(image, gtkMask, CV_BGR2RGB);//Copy the IplImage to RGB format
- //Copy the IplImage data to a GdkPixbuf:
- pix = gdk_pixbuf_new_from_data (
- (guchar*)gtkMask->imageData,//Raw image data
- GDK_COLORSPACE_RGB, //Colorspace
- FALSE, //Has alpha channel or not
- gtkMask->depth, //Bits per pixel
- gtkMask->width, //Width of image
- gtkMask->height, //Height of image
- gtkMask->widthStep, //Row stride
- NULL, //Not sure what this is
- NULL //Not sure what this is
- );
- //gtkImg = gtk_image_new_from_pixbuf (pix);
- 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
- }
- gboolean grab_frames (gpointer data)
- {
- gpointer *stuff;
- stuff = (gpointer*)data;
- CvCapture *video;
- video = CV_CAPTURE (stuff[0]);
- if(!playing)
- {
- return FALSE;
- }
- GtkWidget *draw;
- draw = GTK_WIDGET (stuff[1]);
- if(!cvGrabFrame(video))
- {
- frame_num = 1;
- return FALSE;
- }
- if(frame_num == 1 && first_play)
- {
- frame = cvRetrieveFrame(video);
- frameNew = cvCreateImage (cvSize (frame->width, frame->height), frame->depth, frame->nChannels + 1);
- }
- else
- {
- frame->imageData = cvRetrieveFrame(video)->imageData;
- }
- cvCvtColor (frame, frameNew, CV_BGR2BGRA);
- fix_alpha (frameNew);
- //OpenCV BGRA == Cairo ARGB, with messed up alpha values
- image = cairo_image_surface_create_for_data ((uchar*)frameNew->imageData, CAIRO_FORMAT_ARGB32, frameNew->width, frameNew->height, frameNew->widthStep);
- gtk_widget_queue_draw (draw);
- g_print("Frame number %d\n", frame_num);
- frame_num++;
- return TRUE;
- }
- void fix_alpha (IplImage *src)
- {
- for(int y = 0; y < src->height; y++)
- {
- for(int x = 0; x < src->width; x++)
- {
- ((uchar*)(src->imageData + src->widthStep * y))[x * src->nChannels + 3] = 255;
- }
- }
- //return src->imageData;
- }
Advertisement
Add Comment
Please, Sign In to add comment