1 Feb 2010 (updated 1 Feb 2010 at 23:35 UTC)
»
Looks like it's been a while since I last blogged here, so
here's an update. In the last six months I've mainly been
writing more stereo vision code. This was primarily for use
with the Surveyor SVS, but I also wrote a version which runs
on a PC under Linux.
http://code.google.com/p/libv4l2cam/
v4l2stereo was initially written as an easy way in which to
test the stereo algorithm before transferring it to the
blackfin, but later developed into a piece of software in
its own right. You can see an example of the stereo
disparities obtained with the Minoru webcam here:
http://www.youtube.com/watch?v=EUcLAarcj7U
The Minoru only has a short 6cm baseline, so the effective
stereo range is not very great (probably less than two
metres), but it works well on Linux. As is always the case
with webcams the image capture is not synchronized, so if
the cameras are moving quickly the delay does become a
problem - but for most slow moving robots would be ok.
A recent nice feature of v4l2stereo is that it can be run in
"headless" mode with no GUI output to the screen and also
can stream the image over a network using gstreamer.
I also replaced Rodney's head with a simplified version
which has the Minoru webcam mounted on it.
http://www.youtube.com/watch?v=gNRdcwrTOM0
As of December 2009 I've also been experimenting with
omnidirectional vision. I saw one of the videos from Pi
Robot a while back, and had been meaning to try out
something similar using a Christmas tree decoration as a
spherical mirror. This actually works very well, and I've
now created a new project called Omniclops for this code,
since I didn't want to mix it up with anything else.
http://code.google.com/p/omniclops/
Fortunately the geometry for a spherical mirror is pretty
simple to deal with, and the results look promising. So
promising in fact that it's a cause for regret that I didn't
try doing this many years ago. I've been aware of this type
of vision for at least a decade, but the mirrors always
looked too exotic or expensive to be worth bothering with,
and the idea of making a parabolic mirror by hand without
milling machinery seemed like probably something which
wouldn't be very successful.
Whilst fooling around with omnidirectional vision using a
Christmas decoration a thought occurred to me. Could I
somehow combine stereo vision with omnidirectional vision,
so that objects could be ranged without needing to do
structure from motion? At first I just thought of using a
couple of mirrors with one of the stereo cameras, but then I
thought why not just use a single camera with a wide field
of view looking at multiple mirrors spaced some distance
apart. This seems like a good way to do things for the
following reasons:
- You only need a single camera
- There are no camera synchronisation issues
- There are no illumination/colour correction issues
- Ultra wide field of view compared to conventional stereo
vision
- Very cheap to build
On the down side the resolution of the image within each
mirror is rather low, but this probably isn't a major
handicap. Also the geometry is more complex than for
ordinary stereo vision, but not prohibitively so. I lashed
up a prototype from aluminium and cardboard, using five
mirrors made from Christmas decorations (carefully) sawn in
half to make hemispheres. You can see the resulting effect
like so:
http://www.youtube.com/watch?v=QIuljh7Piso
This is effectively the same as having five cameras with
overlapping fields of view and fisheye lenses. Currently
I'm thinking that this approach may be well suited to voxel
coloring/space carving volumetric techniques, since it
complies with the simple plane ordering constraint and the
positions of the mirrors are known.
Workwise, I'm pretty much unemployed now - like a lot of
software engineers at present - so I can work on this full
time and see if I can get any useful volumetric modeling.