GTK+ Forums Forum Index GTK+ Forums
Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Solved]Problem OpenCV and continuous image frames(video) gtk

 
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming
Author Message
virgoptrex@yahoo.com
Familiar Face


Joined: 03 Feb 2010
Posts: 21

PostPosted: Wed Feb 03, 2010 9:43 pm    Post subject: Solved]Problem OpenCV and continuous image frames(video) gtk Reply with quote

I am working with GIGE camera in opencv 1.0.0 and GTK+2.0 using gcc. I am interested in streaming live video grabbing individual image frames. I have been able to grab just single frame. My problem is how do I update image on the gtkwidget. or repaint it. I know that my pixbuf is being updated and I cannot put "image" widget inside loop or insertion will fail. How do I tell imy "image" widget to get the new value of pix buffer which is being updated by my capture subroutine? I tried using timer and "expose_event" so far no luck :cry: Any help would be appreciated.

Code: (Plaintext)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59



//===================gtk timer and expose event==============================================
static gboolean
on_expose_event(GtkWidget *widget,
    GdkEventExpose *event,
    gpointer data)
{

 capture_image();
    //OpenCV clean up
    cvReleaseImage(&bayerImage);
    cvReleaseImage(&rgbImage);
return FALSE;
}


static gboolean
time_handler(GtkWidget *widget)
{   
   //capture_image();
 gtk_widget_queue_draw(widget);
    cvWaitKey(10);
   printf("hello!\n");
   return TRUE;
}

//===================end of gtk timer and expose event========================================
.
.
.
int main (int argc, char *argv[]) {

 //int key = 0;

    capture_init();
    printf("Camera ID \t\t= %ld\n", myCamera.UID);
    gtk_init(&argc, &argv);


         capture_image();
         image = gtk_image_new_from_pixbuf (pix);

.
.
.
    g_signal_connect(G_OBJECT(window), "expose-event",
      G_CALLBACK(on_expose_event), NULL);

.
.
.g_timeout_add(10, (GSourceFunc) time_handler, (gpointer) window);
.
.
.
}//end main



Last edited by virgoptrex@yahoo.com on Fri Mar 26, 2010 4:09 pm; edited 2 times in total
Back to top
virgoptrex@yahoo.com
Familiar Face


Joined: 03 Feb 2010
Posts: 21

PostPosted: Fri Feb 05, 2010 4:11 pm    Post subject: ok found the solution and got it working :) Reply with quote

Solved this after 4 days x 15 hours of struggle as every newbie to GTK would have to go! Try this and simply replace gdk_draw_arc() function!
Code: (C)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

/* Copyright(c) 2010 Virgoptrex. Feel free to use. But leave credits intact :). */
/* My little gift :D   to the Open Source Community */
#include <gtk/gtk.h>
   
gint t=0;
 
     gboolean
     
expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
     {

     gtk_widget_queue_draw(GTK_WIDGET(widget));

     //g_object_ref_sink (widget->window);
     
     // gdk_drawable_ref (widget->window);

       
gdk_draw_arc (widget->window,
                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
                     TRUE,
                     0, 0, widget->allocation.width, widget->allocation.height,
                     0, 64 * 18*t);
     
      //gdk_drawable_unref (widget->window);
     


       
return TRUE;
     }



static gboolean
time_handler(GtkWidget *widget)
{   

 

  if (t<20)
  { t++; }
  else if (t >=20)
  { t=0; }

 printf("hello %d\n",t);
   return TRUE;


}

int main( int argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *aspect_frame;
    GtkWidget *drawing_area;
    gtk_init (&argc, &argv);
   
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   


    gtk_window_set_title (GTK_WINDOW (window), "Aspect Frame");
    g_signal_connect (G_OBJECT (window), "destroy",
                  G_CALLBACK (gtk_main_quit), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
   
    /* Create an aspect_frame and add it to our toplevel window */
   
   
aspect_frame = gtk_aspect_frame_new ("2x1", /* label */
                                         
0.5, /* center x */
                                         
0.5, /* center y */
                                         
1.33, /* xsize/ysize = 640/480 = 1.33 */
                                         
FALSE /* ignore child's aspect */);
   
    gtk_container_add (GTK_CONTAINER (window), aspect_frame);
    gtk_widget_show (aspect_frame);
   
    /* Now add a child widget to the aspect frame */
   
   
drawing_area = gtk_drawing_area_new ();
   
    /* Ask for a 200x200 window, but the AspectFrame will give us a 200x100
     * window since we are forcing a 2x1 aspect ratio */
   
gtk_widget_set_size_request (drawing_area, 200, 200);
    gtk_container_add (GTK_CONTAINER (aspect_frame), drawing_area);
    gtk_widget_show (drawing_area);

     g_signal_connect (G_OBJECT (drawing_area), "expose_event",
                         G_CALLBACK (expose_event_callback), NULL);

    g_timeout_add(100, (GSourceFunc) time_handler, (gpointer)drawing_area);
 

    gtk_widget_show (window);
    gtk_main ();
    return 0;
}


then one may replace the gdk_draw_arc() with some function like...


Last edited by virgoptrex@yahoo.com on Thu Jun 24, 2010 4:08 am; edited 1 time in total
Back to top
virgoptrex@yahoo.com
Familiar Face


Joined: 03 Feb 2010
Posts: 21

PostPosted: Thu Jun 24, 2010 4:07 am    Post subject: Reply with quote

Here is the improved code.

Code: (C)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133

#include <gtk/gtk.h>
   
gint t=0;
gint time1;



    GtkWidget *window;
    GtkWidget *aspect_frame;
    GtkWidget *drawing_area;
    GtkWidget *vbox1, *toggle1;
 
     gboolean
     
expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
     {

     

     //g_object_ref_sink (widget->window);
     
     // gdk_drawable_ref (widget->window);
       
       
gdk_draw_arc (widget->window,
                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
                     TRUE,
                     0, 0, widget->allocation.width, widget->allocation.height,
                     0, 64 * 18*t);
   
      //gdk_drawable_unref (widget->window);
       
return TRUE;
     }



static gboolean
time_handler(GtkWidget *widget)
{   

  gtk_widget_queue_draw(GTK_WIDGET(widget));

  if (t<20)
  { t++; }
  else if (t >=20)
  { t=0; }

 printf("hello %d\n",t);
   return TRUE;


}

void toggle_button_callback (GtkWidget *widget, gpointer data)
{
    if (GTK_TOGGLE_BUTTON (widget)->active)
    {
         g_print("The button %d pressed\n", GPOINTER_TO_INT( g_object_get_data( G_OBJECT( widget),
                                                    "id" ) ) ); 
         
        /* If control reaches here, the toggle button is down */

         
g_source_remove(time1);
   
    } else {
   
          g_print("The button %d released\n", GPOINTER_TO_INT( g_object_get_data( G_OBJECT( widget),
                                                    "id" ) ) );
         
          time1 = g_timeout_add(100, (GSourceFunc) time_handler, (gpointer)drawing_area);
         
        /* If control reaches here, the toggle button is up */
           
   
}
}


int main( int argc,
          char *argv[] )
{
    gtk_init (&argc, &argv);
   
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   


    gtk_window_set_title (GTK_WINDOW (window), "Aspect Frame");
    g_signal_connect (G_OBJECT (window), "destroy",
                  G_CALLBACK (gtk_main_quit), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
   
     vbox1 = gtk_vbox_new(TRUE,0);


    /* Create an aspect_frame and add it to our toplevel window */
   
   
aspect_frame = gtk_aspect_frame_new ("2x1", /* label */
                                         
0.5, /* center x */
                                         
0.5, /* center y */
                                         
2, /* xsize/ysize = 2 */
                                         
FALSE /* ignore child's aspect */);
   
   
    gtk_container_add( GTK_CONTAINER( window ), vbox1 );

       toggle1 = gtk_toggle_button_new_with_label ("Hold");
      g_signal_connect( toggle1, "toggled", G_CALLBACK( toggle_button_callback ), NULL );
      gtk_box_pack_start(GTK_BOX(vbox1), toggle1, TRUE, TRUE,0);
   
      gtk_box_pack_start(GTK_BOX(vbox1), aspect_frame, TRUE, TRUE,0);   
      gtk_widget_show (aspect_frame);
      gtk_widget_show (vbox1);
   
    /* Now add a child widget to the aspect frame */
   
   
drawing_area = gtk_drawing_area_new ();
   
    /* Ask for a 200x200 window, but the AspectFrame will give us a 200x100
     * window since we are forcing a 2x1 aspect ratio */
   
gtk_widget_set_size_request (drawing_area, 200, 200);
    gtk_container_add (GTK_CONTAINER (aspect_frame), drawing_area);
    gtk_widget_show (drawing_area);

     g_signal_connect (G_OBJECT (drawing_area), "expose_event",
                         G_CALLBACK (expose_event_callback), NULL);

    time1 = g_timeout_add(100, (GSourceFunc) time_handler, (gpointer)drawing_area);
 

    gtk_widget_show_all (window);
    gtk_main ();
    return 0;
}
Back to top
Display posts from previous:   
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming All times are GMT
Page 1 of 1

 


Powered by phpBB © 2001, 2005 phpBB Group
CodeBB 1.0 Beta 2
Protected by Anti-Spam ACP