From: Ilmari Heikkinen Date: 2005-04-30T07:16:02+09:00 Subject: Re: Realtime Ruby/Tk image display? pe, 2005-04-29 kello 22:16, Tom Nakamura kirjoitti: > Here's what I'm trying to do: > > I have a matrox frame grabber, from which I can grab a 640x480x24bit > image from, 30 times per second. > > I want to make a gui where I can grab a frame, do some simple > calculations, add a rectangle or two, and blit it on to a canvas, in > real time (30 times per second). > > The grabbing part, I think I can do with the ruby-v4l; I want to know > how I can update a canvas with this relatively large image at 30 times > per second. I'm trying to use Tk's photo class, but I think since it was > designed for static images, it can't reach that level of performance. > > ideas strongly appreciated, > Tom N > OpenGL should do pretty well here I think. Set up the texture, then use glTexSubImage2D to update it with the video frames. Something like this (may contain bugs): # set up ortho projection and window here... GL::Enable(GL::TEXTURE_2D) tex = GL::GenTextures(1).first GL::BindTexture(GL::TEXTURE_2D, tex) GL::TexImage2D(TEXTURE_2D, 0, GL::RGBA, 1024, 1024, 0, GL::RGB, GL::UNSIGNED_BYTE, "\000"*(3*1024**2)) # whether to use RGB or BGR or BGRA or whatever depends on your # OpenGL's native pixel format w = 640.0/1024 h = 480.0/1024 loop{ pixels = get_frame_from_grabber_as_rgb GL::TexSubImage2D(TEXTURE_2D, 0, 0, 0, 640, 480, GL::RGB, GL::UNSIGNED_BYTE, pixels) GL::Begin(GL::QUADS) # Note the y-flip: # GL uses an y-axis that points up but # video usually uses an y-axis that points down GL::TexCoord(0, 0); GL::Vertex(0, 480, 0) GL::TexCoord(w, 0); GL::Vertex(640, 480, 0) GL::TexCoord(w, h); GL::Vertex(640, 0, 0) GL::TexCoord(0, h); GL::Vertex(0, 0, 0) GL::End() GL::SwapBuffers() } I'm getting around 100fps flipping between two 512x512 RGB images and 30fps flipping between two 1024x1024 RGB images on my GFFX5700. Cheers, Ilmari