Matt23488

cairo stuff

May 24th, 2011
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.51 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. #define MAX_SPEED 33
  13. #define CV_CAPTURE(obj) (CvCapture*)obj
  14.  
  15. /***********************************
  16.          GLOBAL VARIABLES
  17. ***********************************/
  18.  
  19. gboolean popup = FALSE;
  20. cairo_surface_t *image;
  21. int frame_num = 1;
  22. IplImage *frame;
  23. IplImage *frameNew;
  24. gboolean playing = FALSE;
  25. gboolean first_play = TRUE;
  26.  
  27. /***********************************
  28.        FUNCTION DECLARATIONS
  29. ***********************************/
  30.  
  31. GdkPixbuf* convert_open_cv_to_gtk(IplImage *image); //Converts an OpenCV image to a GDK pixel buffer
  32. gboolean grab_frames(gpointer data);
  33. void fix_alpha(IplImage *src);
  34.  
  35. /***********************************
  36.            EVENT HANDLERS
  37. ***********************************/
  38.  
  39. void
  40. popupDestroyed (GtkWindow *window, gpointer user_data)
  41. {
  42.     if(user_data != NULL)
  43.     {
  44.         CvCapture *video;
  45.         video = CV_CAPTURE (user_data);
  46.         if(cvGrabFrame(video))
  47.         {
  48.             g_print ("Video was interrupted...\n");
  49.         }
  50.         cvReleaseCapture (&video);
  51.         //cvReleaseImage (&frame);
  52.         //cvReleaseImage (&frameNew);
  53.         frame_num = 1;
  54.         playing = FALSE;
  55.         first_play = FALSE;
  56.     }
  57.     gtk_widget_destroy (GTK_WIDGET (window));
  58.  
  59.     popup = FALSE;
  60. }
  61.  
  62. void
  63. buttonShowImg_clicked (GtkButton *button, gpointer user_data)
  64. {
  65.     GtkEntry *entry;
  66.     entry = GTK_ENTRY (user_data);
  67.  
  68.     if(!popup)
  69.     {
  70.         IplImage *cvImage;
  71.         cvImage = cvLoadImage(gtk_entry_get_text(entry));
  72.  
  73.         if(cvImage == NULL)
  74.         {
  75.             GtkWidget *dialog;
  76.             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));
  77.  
  78.             //gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), GTK_WIDGET (gtk_image_new_from_pixbuf (convert_open_cv_to_gtk(cvLoadImage("picture.png")))));
  79.  
  80.             gtk_dialog_run (GTK_DIALOG (dialog));
  81.             gtk_widget_destroy (dialog);
  82.  
  83.             return;
  84.         }
  85.  
  86.         GdkPixbuf *pix;
  87.         pix = convert_open_cv_to_gtk(cvImage);
  88.  
  89.         GtkWidget *image;
  90.         image = gtk_image_new_from_pixbuf (pix);
  91.  
  92.         GtkWidget *window;
  93.         GtkWidget *vbox;
  94.        
  95.  
  96.         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  97.         gtk_window_set_title (GTK_WINDOW (window), gtk_entry_get_text (entry));
  98.         vbox = gtk_vbox_new (FALSE, 6);
  99.         gtk_container_add (GTK_CONTAINER (window), vbox);
  100.         gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
  101.        
  102.         g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), NULL);
  103.  
  104.         gtk_widget_show_all (window);
  105.         popup = TRUE;
  106.     }
  107. }
  108.  
  109. gboolean
  110. expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
  111. {
  112.     cairo_t *cr;
  113.     cr = gdk_cairo_create (widget->window);
  114.  
  115.     cairo_set_source_surface (cr, image, 0, 0);
  116.  
  117.     cairo_paint (cr);
  118.     cairo_destroy (cr);
  119.  
  120.     return TRUE;
  121. }
  122.  
  123. void
  124. buttonShowVid_clicked (GtkButton *button, gpointer user_data)
  125. {
  126.     if(popup)
  127.     {
  128.         return;
  129.     }
  130.     GtkEntry *entry;
  131.     entry = GTK_ENTRY (user_data);
  132.  
  133.     CvCapture *video;
  134.     video = cvCreateFileCapture (gtk_entry_get_text (entry));
  135.  
  136.     if(video == NULL)
  137.     {
  138.         GtkWidget *errDialog;
  139.         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));
  140.         gtk_dialog_run (GTK_DIALOG (errDialog));
  141.         gtk_widget_destroy (errDialog);
  142.         return;
  143.     }
  144.  
  145.     GtkWidget *window;
  146.     GtkWidget *vbox;
  147.     GtkWidget *draw;
  148.  
  149.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  150.     vbox = gtk_vbox_new (FALSE, 0);
  151.     draw = gtk_drawing_area_new ();
  152.  
  153.     gtk_window_set_default_size (GTK_WINDOW (window), cvQueryFrame(video)->width, cvQueryFrame(video)->height);
  154.     gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
  155.     gtk_widget_set_size_request (draw, cvQueryFrame(video)->width, cvQueryFrame(video)->height);
  156.    
  157.     gpointer *stuff;
  158.     stuff = new gpointer[2];
  159.     stuff[0] = (gpointer)video;
  160.     stuff[1] = (gpointer)draw;
  161.  
  162.     playing = TRUE;
  163.     g_timeout_add (MAX_SPEED, grab_frames, (gpointer)stuff);
  164.    
  165.     g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), (gpointer)video);
  166.     g_signal_connect (G_OBJECT (draw), "expose-event", G_CALLBACK (expose_event_callback), NULL);
  167.  
  168.     gtk_container_add (GTK_CONTAINER (window), vbox);
  169.     gtk_box_pack_start (GTK_BOX (vbox), draw, FALSE, FALSE, 0);
  170.  
  171.     gtk_widget_show_all (window);
  172.  
  173.     popup = TRUE;
  174. }
  175.  
  176. void
  177. scan_mode_button_pressed (GtkButton *button, gpointer user_data_unused)
  178. {
  179.     GtkWidget *dialog;
  180.     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));
  181.     gtk_dialog_run (GTK_DIALOG (dialog));
  182.     gtk_widget_destroy (dialog);
  183. }
  184.  
  185. void
  186. scan_mode_window_show (GtkButton *button, gpointer user_data_unused)
  187. {
  188.     if(popup)
  189.     {
  190.         return;
  191.     }
  192.     //Declarations
  193.     //Containers/Boxes Declared in Tree Form
  194.     GtkWidget   *window;
  195.     GtkWidget       *vboxMain;
  196.     GtkWidget           *hboxMenu;
  197.     GtkWidget           *hboxTopButtons;
  198.     GtkWidget           *hboxTopImages;
  199.     GtkWidget           *hboxBot;
  200.     GtkWidget               *vboxBot1;
  201.     GtkWidget                   *hboxVboxBot11;
  202.     GtkWidget                   *hboxVboxBot12;
  203.     GtkWidget               *vboxBot2;
  204.     GtkWidget                   *hboxVboxBot21;
  205.     GtkWidget                   *hboxVboxBot22;
  206.     GtkWidget               *vboxBot3;
  207.     GtkWidget                   *vboxVboxBot31;
  208.     GtkWidget                       *hboxPath;
  209.     GtkWidget                       *hboxResolution;
  210.     GtkWidget                       *hboxSteps;
  211.     GtkWidget                   *vboxVboxBot32;
  212.  
  213.     //Other Widgets
  214.     GtkWidget *menuBar;
  215.     GtkWidget *fileMenuItem;
  216.     GtkWidget *fileMenu;
  217.     GtkWidget *quitMenuItem;
  218.     GtkWidget *saveButton;
  219.     GtkWidget *calibrateButton;
  220.     GtkWidget *scanButton;
  221.     GtkWidget *restoreButton;
  222.     GtkWidget *cam1;
  223.     GtkWidget *cam2;
  224.     GtkWidget *cam3;
  225.     GtkWidget *image4;
  226.     GtkWidget *image5;
  227.     GtkWidget *pathLabel;
  228.     GtkWidget *resolutionLabel;
  229.     GtkWidget *stepsLabel;
  230.     GtkWidget *pathEntry;
  231.     GtkWidget *resolutionEntry;
  232.     GtkWidget *stepsEntry;
  233.     GtkWidget *hscale1;
  234.     GtkWidget *hscale2;
  235.     GtkWidget *hscale3;
  236.  
  237.     //Video
  238.     CvCapture *video;
  239.     video = cvCreateFileCapture ("boucing_ball.divx");
  240.  
  241.     //Initializations
  242.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  243.     vboxMain = gtk_vbox_new (FALSE, 6);
  244.     //hboxMenu = gtk_hbox_new (FALSE, 6);
  245.     hboxTopButtons = gtk_hbox_new (FALSE, 6);
  246.     hboxTopImages = gtk_hbox_new (FALSE, 6);
  247.     hboxBot = gtk_hbox_new (FALSE, 6);
  248.     vboxBot1 = gtk_vbox_new (FALSE, 6);
  249.     hboxVboxBot11 = gtk_hbox_new (FALSE, 6);
  250.     hboxVboxBot12 = gtk_hbox_new (FALSE, 6);
  251.     vboxBot2 = gtk_vbox_new (FALSE, 6);
  252.     hboxVboxBot21 = gtk_hbox_new (FALSE, 6);
  253.     hboxVboxBot22 = gtk_hbox_new (FALSE, 6);
  254.     vboxBot3 = gtk_vbox_new (FALSE, 6);
  255.     vboxVboxBot31 = gtk_vbox_new (FALSE, 6);
  256.     vboxVboxBot32 = gtk_vbox_new (FALSE, 6);
  257.     hboxPath = gtk_hbox_new (FALSE, 6);
  258.     hboxResolution = gtk_hbox_new (FALSE, 6);
  259.     hboxSteps = gtk_hbox_new (FALSE, 6);
  260.  
  261.     menuBar = gtk_menu_bar_new ();
  262.     fileMenuItem = gtk_menu_item_new ();
  263.     fileMenu = gtk_menu_new ();
  264.     quitMenuItem = gtk_menu_item_new ();
  265.     saveButton = gtk_button_new_with_label ("Save");
  266.     calibrateButton = gtk_button_new_with_label ("Calibrate");
  267.     scanButton = gtk_button_new_with_label ("Scan");
  268.     restoreButton = gtk_button_new_with_label ("Restore");
  269.     cam1 = gtk_image_new_from_file ("picture2.png");
  270.     //cam1 = gtk_drawing_area_new ();
  271.     cam2 = gtk_image_new_from_file ("picture2.png");
  272.     cam3 = gtk_image_new_from_file ("picture2.png");
  273.     image4 = gtk_image_new_from_file ("picture2.png");
  274.     image5 = gtk_image_new_from_file ("picture2.png");
  275.     pathLabel = gtk_label_new ("Path:");
  276.     resolutionLabel = gtk_label_new ("Resolution:");
  277.     stepsLabel = gtk_label_new ("Steps:");
  278.     pathEntry = gtk_entry_new ();
  279.     resolutionEntry = gtk_entry_new();
  280.     stepsEntry = gtk_entry_new();
  281.     hscale1 = gtk_hscale_new_with_range (0.0, 10.0, 1.0);
  282.     hscale2 = gtk_hscale_new_with_range (0.0, 10.0, 0.1);
  283.     hscale3 = gtk_hscale_new_with_range (0.0, 10.0, 0.01);
  284.  
  285.     //Extra Initializations
  286.     gtk_window_set_title (GTK_WINDOW (window), "Scan Mode");
  287.     gtk_menu_item_set_label (GTK_MENU_ITEM (fileMenuItem), "File");
  288.     gtk_menu_item_set_label (GTK_MENU_ITEM (quitMenuItem), "Quit");
  289.     //gtk_menu_set_title (GTK_MENU (fileMenu), "File");
  290.     //gtk_widget_set_size_request (cam1, 640, 480);
  291.  
  292.  
  293.     gtk_menu_item_set_submenu (GTK_MENU_ITEM (fileMenuItem), fileMenu);
  294.     gtk_menu_shell_append (GTK_MENU_SHELL (fileMenu), quitMenuItem);
  295.     gtk_menu_shell_append (GTK_MENU_SHELL (menuBar), fileMenuItem);
  296.  
  297.     //Set up data for the timer
  298.     //gpointer *stuff;
  299.     //stuff = new gpointer[2];
  300.     //stuff[0] = (gpointer)video;
  301.     //stuff[1] = (gpointer)cam1;
  302.  
  303.     //G Timer
  304.     //g_timeout_add (MAX_SPEED, grab_frames, (gpointer)stuff);
  305.  
  306.     //Event Handler Hookups
  307.     g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (popupDestroyed), (gpointer)video);
  308.     g_signal_connect (G_OBJECT (quitMenuItem), "activate", G_CALLBACK (gtk_main_quit), NULL);
  309.     g_signal_connect (G_OBJECT (saveButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
  310.     g_signal_connect (G_OBJECT (calibrateButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
  311.     g_signal_connect (G_OBJECT (scanButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
  312.     g_signal_connect (G_OBJECT (restoreButton), "clicked", G_CALLBACK (scan_mode_button_pressed), NULL);
  313.     //g_signal_connect (G_OBJECT (cam1), "expose-event", G_CALLBACK (expose_event_callback), NULL);
  314.  
  315.     //GUI Assemblage
  316.     gtk_container_add (GTK_CONTAINER (window), vboxMain);
  317.  
  318.     gtk_box_pack_start (GTK_BOX (vboxMain), /*hboxMenu*/menuBar, FALSE, FALSE, 6);
  319.     gtk_box_pack_start (GTK_BOX (vboxMain), hboxTopButtons, FALSE, FALSE, 6);
  320.     gtk_box_pack_start (GTK_BOX (vboxMain), hboxTopImages, FALSE, FALSE, 6);
  321.     gtk_box_pack_start (GTK_BOX (vboxMain), hboxBot, FALSE, FALSE, 6);
  322.  
  323.     //gtk_box_pack_start (GTK_BOX(hboxMenu), menuBar, FALSE, FALSE, 6);
  324.  
  325.     gtk_box_pack_start (GTK_BOX (hboxTopButtons), saveButton, FALSE, FALSE, 6);
  326.     gtk_box_pack_start (GTK_BOX (hboxTopButtons), calibrateButton, FALSE, FALSE, 6);
  327.     gtk_box_pack_start (GTK_BOX (hboxTopButtons), scanButton, FALSE, FALSE, 6);
  328.  
  329.     gtk_box_pack_start (GTK_BOX (hboxTopImages), cam1, FALSE, FALSE, 6);
  330.     gtk_box_pack_start (GTK_BOX (hboxTopImages), cam2, FALSE, FALSE, 6);
  331.     gtk_box_pack_start (GTK_BOX (hboxTopImages), cam3, FALSE, FALSE, 6);
  332.  
  333.     gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot1, FALSE, FALSE, 6);
  334.     gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot2, FALSE, FALSE, 6);
  335.     gtk_box_pack_start (GTK_BOX (hboxBot), vboxBot3, FALSE, FALSE, 6);
  336.  
  337.     gtk_box_pack_start (GTK_BOX (vboxBot1), hboxVboxBot11, FALSE, FALSE, 6);
  338.     gtk_box_pack_start (GTK_BOX (vboxBot1), hboxVboxBot12, FALSE, FALSE, 6);
  339.  
  340.     gtk_box_pack_start (GTK_BOX (hboxVboxBot11), image4, FALSE, FALSE, 6);
  341.  
  342.     gtk_box_pack_start (GTK_BOX (hboxVboxBot12), restoreButton, FALSE, FALSE, 6);
  343.  
  344.     gtk_box_pack_start (GTK_BOX (vboxBot2), hboxVboxBot21, FALSE, FALSE, 6);
  345.     gtk_box_pack_start (GTK_BOX (vboxBot2), hboxVboxBot22, FALSE, FALSE, 6);
  346.  
  347.     gtk_box_pack_start (GTK_BOX (hboxVboxBot21), image5, FALSE, FALSE, 6);
  348.  
  349.     gtk_box_pack_start (GTK_BOX (vboxBot3), vboxVboxBot31, FALSE, FALSE, 6);
  350.     gtk_box_pack_start (GTK_BOX (vboxBot3), vboxVboxBot32, FALSE, FALSE, 6);
  351.  
  352.     gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxPath, TRUE, TRUE, 6);
  353.     gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxResolution, TRUE, TRUE, 6);
  354.     gtk_box_pack_start (GTK_BOX (vboxVboxBot31), hboxSteps, TRUE, TRUE, 6);
  355.  
  356.     gtk_box_pack_start (GTK_BOX (hboxPath), pathLabel, FALSE, FALSE, 6);
  357.     gtk_box_pack_start (GTK_BOX (hboxPath), pathEntry, TRUE, TRUE, 6);
  358.  
  359.     gtk_box_pack_start (GTK_BOX (hboxResolution), resolutionLabel, FALSE, FALSE, 6);
  360.     gtk_box_pack_start (GTK_BOX (hboxResolution), resolutionEntry, TRUE, TRUE, 6);
  361.  
  362.     gtk_box_pack_start (GTK_BOX (hboxSteps), stepsLabel, FALSE, FALSE, 6);
  363.     gtk_box_pack_start (GTK_BOX (hboxSteps), stepsEntry, TRUE, TRUE, 6);
  364.  
  365.     gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale1, FALSE, FALSE, 6);
  366.     gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale2, FALSE, FALSE, 6);
  367.     gtk_box_pack_start (GTK_BOX (vboxVboxBot32), hscale3, FALSE, FALSE, 6);
  368.  
  369.     //Show the GUI
  370.     gtk_widget_show_all (window);
  371.  
  372.     popup = TRUE;
  373.  
  374. }
  375.  
  376. /***********************************
  377.             ENTRY POINT
  378. ***********************************/
  379.  
  380. int main (int argc, char **argv)
  381. {
  382.     //Variable declarations
  383.     GtkWidget *window;
  384.     GtkWidget *vbox;
  385.     GtkWidget *hbox;
  386.     GtkWidget *hbox2;
  387.     GtkWidget *hbox3;
  388.     GtkWidget *buttonShowImg;
  389.     GtkWidget *buttonShowVid;
  390.     GtkWidget *buttonScan;
  391.     GtkWidget *entry;
  392.  
  393.     //Call this before setting up widgets, etc
  394.     gtk_init (&argc, &argv);
  395.  
  396.  
  397.  
  398.     //Variable initializations
  399.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  400.     gtk_window_set_title (GTK_WINDOW (window), "Main Window");
  401.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 100);
  402.     gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER_ON_PARENT);
  403.  
  404.     vbox = gtk_vbox_new (TRUE, 6);
  405.     hbox = gtk_hbox_new (TRUE, 6);
  406.     hbox2 = gtk_hbox_new (TRUE, 6);
  407.     hbox3 = gtk_hbox_new (TRUE, 6);
  408.  
  409.     buttonShowImg = gtk_button_new_with_label ("Show Image");
  410.     buttonShowVid = gtk_button_new_with_label ("Show Video");
  411.     buttonScan = gtk_button_new_with_label ("Scan Mode");
  412.  
  413.     entry = gtk_entry_new ();
  414.     gtk_entry_set_text (GTK_ENTRY (entry), "bouncing_ball.divx");//"bouncing_ball.divx"/*"picture.png"*/);
  415.  
  416.     //Event handler hookups
  417.     g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
  418.     g_signal_connect (G_OBJECT (buttonShowImg), "clicked", G_CALLBACK (buttonShowImg_clicked), (gpointer)entry);
  419.     g_signal_connect (G_OBJECT (buttonShowVid), "clicked", G_CALLBACK (buttonShowVid_clicked), (gpointer)entry);
  420.     g_signal_connect (G_OBJECT (buttonScan), "clicked", G_CALLBACK (scan_mode_window_show), NULL);
  421.  
  422.     //GUI assemblage
  423.     gtk_container_add (GTK_CONTAINER (window), vbox);
  424.  
  425.     gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 6);
  426.     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6);
  427.     gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 6);
  428.     gtk_box_pack_start (GTK_BOX (vbox), hbox3, FALSE, FALSE, 6);
  429.     gtk_box_pack_start (GTK_BOX (hbox), buttonShowImg, FALSE, FALSE, 6);
  430.     gtk_box_pack_start (GTK_BOX (hbox2), buttonShowVid, FALSE, FALSE, 6);
  431.     gtk_box_pack_start (GTK_BOX (hbox3), buttonScan, FALSE, FALSE, 6);
  432.  
  433.     //Show the GUI elements
  434.     gtk_widget_show_all (window);
  435.  
  436.  
  437.  
  438.  
  439.     //Call this AFTER setting up widgets etc
  440.     gtk_main ();
  441.  
  442.     return 0;
  443. }
  444.  
  445. /***********************************
  446.         FUNCTION DEFINITIONS
  447. ***********************************/
  448.  
  449. GdkPixbuf* convert_open_cv_to_gtk(IplImage *image)
  450. {
  451.     IplImage *gtkMask;
  452.     //GtkWidget *gtkImg;
  453.     GdkPixbuf *pix;
  454.  
  455.     gtkMask = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);//Create another image with the same stuff
  456.     cvCvtColor(image, gtkMask, CV_BGR2RGB);//Copy the IplImage to RGB format
  457.     //Copy the IplImage data to a GdkPixbuf:
  458.     pix = gdk_pixbuf_new_from_data (
  459.         (guchar*)gtkMask->imageData,//Raw image data
  460.         GDK_COLORSPACE_RGB,         //Colorspace
  461.         FALSE,                      //Has alpha channel or not
  462.         gtkMask->depth,             //Bits per pixel
  463.         gtkMask->width,             //Width of image
  464.         gtkMask->height,            //Height of image
  465.         gtkMask->widthStep,         //Row stride
  466.         NULL,                       //Not sure what this is
  467.         NULL                        //Not sure what this is
  468.     );
  469.     //gtkImg = gtk_image_new_from_pixbuf (pix);
  470.     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
  471. }
  472.  
  473. gboolean grab_frames (gpointer data)
  474. {
  475.     gpointer *stuff;
  476.     stuff = (gpointer*)data;
  477.  
  478.    
  479.     CvCapture *video;
  480.     video = CV_CAPTURE (stuff[0]);
  481.     if(!playing)
  482.     {
  483.         return FALSE;
  484.     }
  485.     GtkWidget *draw;
  486.     draw = GTK_WIDGET (stuff[1]);
  487.  
  488.    
  489.     if(!cvGrabFrame(video))
  490.     {
  491.         frame_num = 1;
  492.         return FALSE;
  493.     }
  494.     if(frame_num == 1 && first_play)
  495.     {
  496.         frame = cvRetrieveFrame(video);
  497.         frameNew = cvCreateImage (cvSize (frame->width, frame->height), frame->depth, frame->nChannels + 1);
  498.     }
  499.     else
  500.     {
  501.         frame->imageData = cvRetrieveFrame(video)->imageData;
  502.     }
  503.    
  504.     cvCvtColor (frame, frameNew, CV_BGR2BGRA);
  505.     fix_alpha (frameNew);
  506.  
  507.     //OpenCV BGRA == Cairo ARGB, with messed up alpha values
  508.     image = cairo_image_surface_create_for_data ((uchar*)frameNew->imageData, CAIRO_FORMAT_ARGB32, frameNew->width, frameNew->height, frameNew->widthStep);
  509.     gtk_widget_queue_draw (draw);
  510.     g_print("Frame number %d\n", frame_num);
  511.     frame_num++;
  512.  
  513.     return TRUE;
  514. }
  515.  
  516. void fix_alpha (IplImage *src)
  517. {
  518.     for(int y = 0; y < src->height; y++)
  519.     {
  520.         for(int x = 0; x < src->width; x++)
  521.         {
  522.             ((uchar*)(src->imageData + src->widthStep * y))[x * src->nChannels + 3] = 255;
  523.         }
  524.     }
  525.     //return src->imageData;
  526. }
Advertisement
Add Comment
Please, Sign In to add comment