I’m happy to announce the release of some enhancement to the CCV Tracker. I call it ”TUIO multiplexer suite”
It consists of a enhanced CCV Version (based on Version 1.2) and a TUIO multiplexer.
A short feature List:
TUIO 1.1 message sending (to distinguish the messages from different trackers).
UDP-calibration data sending, to inform the TUIO multiplexer about a calibration operation.
UDP-Alive trigger function, to get an “alive” message from a CCV instance to monitor if it’s still running.
GUI Interface elements position are now set in the conf.xml file.
FFMV implementation modified (for PointGrey cameras) to connect multiple FireFly cameras to multiple instances of CCV on one computer.
You now set a “DEVICE_MODEL"- tag , so you could connect multiple cameras from different vendors at the same time.
Some minor modification for problems that arise with multi camera setups and tiny bugs from CCV.(no 0,0 position sending if the finger is outside the calibration rectangle, finger acceleration data is now not undefined)
To say it clear: This is not a multi camera enhancement for one CCV instance like stitching-solutions with the PS3 driver, but a solution to run multiple instances of CCV concurrently!
Multiplexing of the TUIO data from different TUIO sources who support the TUIO 1.1 specification (At this time only the 2DCur and 2Dobj )
Sending of TUIO 2Dcur and 2Dobj messages.
Visual representation of your multi-camera setup to make a calibration possible.
Memory consumption monitoring with automatic shutdown/restart (there is some ATI driver problem on some cards that causes a memory leak with the OpenGL glDrawPixels call ! Perhaps some OpenGL guru will fix it with better FBO-code )
First i wanna talk about the CCV upgrade:
Fiducial support with the ofxFiducial addon from Alain Ramos based on the fidTrack.lib from Ross Bencina
There where some consideration i had to made as i realized in my first naive implementation that a concurrent Blob and Fiducial tracking does not work in one image.
I decided to create a second filter-chain, so there are two independent images for the image processing.
This is far better then a single Image solution but it’s not the “Silver Bullet” solution. You still have to life with some drawbacks.
The fiducial tracking works like a charme, as fingers are not recognized as fiducials. On the other site a fiducial could be recognized as a finger, so it depend on your filter-settings to get a satisfied solution.
Well if someone gets wet eyes on this he has something to consider about the fiducial-markers from reacTIVision . Martin Kaltenbrunner has mentioned there is some licence restriction on the original fiducial-set from reacTIVision . So your are not allowed to use them outside of the Reactivision tracker in commercial projects, without inquire for a licence.
There is another way to circumvent this with the FidGen-tool from Toxi, so i did not include a tree-file for a marker-set.
You have to create your own or get anyone elsewhere. It should placed in the “data” folder and you could set the right name in the config.xml.
If you wanna run CCV without Fiducial tracking there is a flag in the Config.xml to start in “normal” mode for better performance.
So for a normal CCV user, all you’ve got more from this CCV-version is fiducial support, but the real power of the system comes in conjunction with the TUIO-multiplexer.
With this combination your are able to make a scalable multi camera/screen setup on basis of CCV. Theoretically it should scale infinitely, as you could daisy-chain multiple multiplexers.
The key for this scalability is my different approach for multi camera support, then the solutions who trying to bring more cameras into one CCV instance, so at one point your CPU will have not enough power. I know for the most of the setups the two camera solution with the PS3 driver will work, but i had to face with a project where i had to track a round surface with a diameter of 2,4m (~ 100 Inch) with 8 Cameras. And as the PS3 driver is constrained to two Cameras, i conceived this solution. So i have to say this is not a cheap solution based on the PS3 camera, as I’m aware the PS3 driver did not give you a different DeviceID if you trying to run multiple PS3 cameras on one Computer.
If you look for large multi camera solution you will stumble across the incredible capabilities of the Firefly MV camera from Pointgrey. They have a long experience with large setups and you get a incredible driver for their products. CCV has native support for the Firefly but the current implementation prevent you to start muliple cameras at the same time on one computer without crashing.
Well it was a quick fix, so now CCV doesn’t scan all plugged cameras but only the one you specify with the deviceID in the config-xml.
For the best performance and data throughput i use the Firewire version. I connected 4 cameras(640x480) at two Firewire cards on a QuadCore machine without any problems.Two machines with this setup where multiplexed on a third machine.
So the next big question is, how do i could calibrate such an setup? CCV has it’s own calibration routine wich works excellent and why reinvent the wheel?
For this problem there is a connection between CCV and the TUIO multiplexer, so you define your whole camera setup in the conf.xml file from the multiplexer with all the translations and rotations of the different cameras
and get a visual representation from that.
You also get feedback where your fingers are mapped with green dots for fingers and a tiny quadrat with the ID for fiducials.
This is your visual reference of the setup and now you could align the cameras to observe the right area.
If you step into the calibration mode in CCV the multiplexer get notified and get the amount of x/y calibration points you set in CCV.( Your BoundingBox settings in the calibration-file from CCV must have 0,0,1,1!)
Now you get a visual representation of the calibration points and the current selected point is highlighted and you see where you have to put your finger down. CCV Will see it and do the calibration for you. After calibration the green points position should match your finger position for that screen. To handle this you should have at least two monitors if you work on one machine, as CCV goes in full-screen mode and you aren’t able to see the multiplexer screen.
The whole system could be distributed on different computers so your sourcename@IPAddress combination should match between the values in CCV and the multiplexer. Look at the conf.xml files and everything should be self explanatory.
(Is anybody following?)
Every instance of CCV who wants to communicate with the multiplexer is represented as a “source"- tag in the conf-file. If a source@address combination from a CCV instance doesn’t match with the values in the source-tag, your data will be dropped by the Multiplexer.
The multiplexer has two modes: “circle” and “square”. Play around and you will see the difference for your screen-layout. For a better usability you could move the window with the arrow-keys.(+shift => stepsize 10) ,"h" and you hide the window.
Internally the multipexer receives all the TUIO data (it’s a normal TUIO-client). All fingers who are matching a source@ipaddress entry in the config-file where taken and from their position data i draw some circles into a Texture. Then i apply the same blob tracking from CCV. The fiducial administration is done by the TUIO-client code from Martin.
So i don’t know if anybody could use this tool or my approach missed the point and there are better solutions I’m not aware. I think this solution makes only real sense on very large setups, or if you using other cameras then the PS3.
Feel free to drop me a line.
At this time i will only give a binary version for testing. So give me feedback if you find some bugs or have ideas for improvements.
When i’m finished with some code clean up and some tiny fixes i will post the sources.
A big gratitude(beside the NUI Group) goes to Martin Kaltenbrunner for the incredible work on the TUIO platform and his reference implementations!
Here a video to get a picture of the capabilities:
(My responsibility was just the development of the multi touch middleware and camera setup, so I’m not quite happy with the lack of good interaction design . )