Whiteboard Team
Ajay Gaddam, Raja Chintalapati, Vijaya Mekala
The Virtual Whiteboards functionality of Unicron comprises the following
scope:
- capturing data from the electronic whiteboard hardware, and providing
that data efficiently to the CVE
- capturing data from the web cameras, and providing that data efficiently
to the CVE
- implementing a pure virtual whiteboard class, with drawing and network
transmission of data
- implementing (high performance) language support for dynamic textures
In general, transmitting the entire whiteboard image contents is inefficient
in terms of bandwidth requirements, so the whiteboard team is concerned with
reducing that bandwidth by incrementally updating textures. A student
observed that MPEG is based on similar principles.
Steps
At almost every step, test by writing image to file.
- read camera JPG into memory - done
- uncompress JPG data - done already
- crop image to whiteboard boundary - done
- modify cropping to read coordinates from config files - Ajay
Note: the boundary will be given by four (x,y) pixel coordinates
that you read from a config file.
- fix keystoning (modify trapezoid to become a rectangle) - done (Vijay)
- scale image to texture dimensions (powers of 2, e.g. 1024x512 pixels) - done
- Write an "image processing server" that fetches JPEG data from cameras.
Version 1 should do so continuously, as fast as it can (done, could be
tuned for performance and measured some more).
- Image processing server step 2.
In addition to polling the cameras,
listen on TCP ports 4550-4552 for HTTP requests for the three
cameras' cropped, scaled, keystoned, texture image files. Providing http
service can use separate thread(s) from the fetch task.
The image processing server will probably run on the same
host as the CVE server.
- Modify CVE server configuration to know whether
its got an image processing server.
- Image processing server
Version 2 can add sleep modes, and reduced frame rate controls.
- Write images, with sequence id's, to files in dat/textures/cam[1234]/idnum.jpg
Remove old images with some reasonable scheme. Scheme1 might be: keep two copies
of each camera at any given time. Send CVE server message when new image is
ready. Wait for CVE server to ask for next message (on each camera).
For each frame, write file to disk and send server an update notice.
- send whole image to CVE clients
The server will decide which clients should receive this data.
Clients should pull image data from image processing server.
- LATER "whiten"/normalize image - done some work
- LATER stamp image with a timestamp
- LATER "diff" adjacent images.
identify only pen changes. create a minimal rectangle.
- LATER remove instructor.
- send image data (LATER: a minimal rectangle, with coordinates) to CVE clients
- CVE clients update their version of texture the slow way
- add support for minimal memory-based window ops in native OpenGL format.
These ops consist mainly of: setpixel and copyarea - Omar El Khatib
Image Processing Libraries we have Evaluated
- ImageJ
- java.awt.image
- Java advanced imaging
- CVIPtools
Sample Images
An older sample shot.
Links
-
http://research.microsoft.com/~zhang/Papers/TR03-39.pdf
- an interesting TR from microsoft
- a funky site recommended by Vijaya