Interactive Floor for GNR (the Portguese national guard)

I worked with O Cubo in creating an interactive floor for GNR (the portuguese national guard) as part of the celebrations for the centenary of the portuguese republic.
It allowed the visitors to look through several historical archive images in a fun and engaging way.

The exhibition ran for 3 weeks during April at GNR’s headquarters in Largo do Carmo, Lisbon.

It was created in C++ using OpenFrameworks with OpenCV and OpenGL

O Cubo: www.ocubo.com

http://vimeo.com/11730026

some more pictures on flickr http://www.flickr.com/photos/ruimadeira-…-056735398/

Best

Rui

nice…:slight_smile:

Great job, I’d love to see the code :slight_smile:

Hi,

thanks, glad you like it.

@Tim S, sorry i don’t plan on releasing the code. But i’ll be glad to answer any questions you might have.

Best

Rui

How many projectors and cams did you use for this?

Hi potter3366

we used 3 cameras and 3 projectors. The camera images are stitched together using a quad multiplexer and fed into the computer as a single input. They are then separated in software using OpenCV

best

Rui

Hi smuorfy

Don’t know exactly the models but they where some regular CCTV cameras and quad multiplexer from a surveillance store.

To separate the images in OpenCV i set the ROI to match each image’s area in the main image and copied it to a separate image.
The multiplexer gives an image which is a mosaic of 4 images. The camera images are inserted int the multiplexer in the top left, top right and bottom left quadrants. The bottom right has no signal so its a just a black square which is ignored.

  
  
       //top left image  
       cvSetImageROI(grayCamImg->getCvImage(), cvRect(0, 0, 320, 240));  
       cvCopy(grayCamImg->getCvImage(), grayParts[0]->getCvImage());  
       cvResetImageROI(grayCamImg->getCvImage());  
	  
        //top right image  
	cvSetImageROI(grayCamImg->getCvImage(), cvRect(320, 0, 320, 240));  
	cvCopy(grayCamImg->getCvImage(), grayParts[1]->getCvImage());  
	cvResetImageROI(grayCamImg->getCvImage());  
	  
        //bottom left image  
	cvSetImageROI(grayCamImg->getCvImage(), cvRect(0, 240, 320, 240));  
	cvCopy(grayCamImg->getCvImage(), grayParts[2]->getCvImage());  
	cvResetImageROI(grayCamImg->getCvImage());  
  

best

Rui

Hi RUI,

looks very great. i would like to ask you if you can give any information about the bending texture? how is this done?

thank you.

Hi circassia

The top image is made by a grid of quads, textured to make up the image when in their original position (like a puzzle).
the animation is all physics based. Each quad is made of 4 particles connected by 4 springs.
Each blob detected by the contour finder applies a repulsion force to these particles. They also have a small force applied towards their original position to make the grid close when no one is in there.

I used ofxRuiPhysics3d (the animation is in 3d, and the repulsion force is applied under the particles just to give them a little perspective), but its all very simple. It could easily have been made with MASPhysics or Box2d or other physics lib.

Best

Rui

Nice job, looks good.

Hi Rui!

How did you solve the problem of edge blending (hardware edge blending?)?

Hi potter3366

I used a grid based image warper (that should be released as an addon soon enough, as soon as i clean the code). We didn’t do any blending, just adjusted the edges of the videos so they stitch together.
The image warper is made using FBO’s and has some nice features :slight_smile:
The code is still pretty messy and some stuff is not finished or hasn’t been tested but i can send it if anyone’s interested, just PM me.

Best

Rui

Great app!

Did you use infrared spectrum, IR filters, IR Cams. How did you deal with a feedback from the interactive floor coming into camera?

Thanks.

Hi,

yes, we used IR lights and cameras.
To prevent feedback we used a visible light filter (made with black photograph film) which blocks light form the projector, so only IR light is captured by the camera.

:slight_smile:
Rui

Hi Rul,

Great installation. It runs very smooth. Let me ask two questions:

  1. What was the approx. size of the projected surface?
  2. Did you use any sort of contour tracker? (if so, which one?) or just periodically chek contours positions?

Thanks :slight_smile:

Hi Ozke

  1. i believe the total area was around 12meters long by 3 meters wide.

  2. no, it was just ofxContourFinder and applying a repulsion force at each blob’s position.

best

Rui

I forgot to ask, what kind of IR lights did you use?

Hi Ozke

just regular IR lights bought from a surveillance shop. I didn’t buy them so don’t know the details, just know they where rather strong and had a wide angle.

cheers

Rui