ObjectiveThis project is very much still at the prototype stage but the objective is to build a fairly accurate speed detector for motor-sport, road traffic, RC hobby vehicles, athletes, etc. using little more than a Powershot camera running CHDK, and a BeagleBone Black (or Raspberry Pi) running OpenCV.
I wanted to meet a few primary requirements:
- Low cost (suitable machine vision cameras start at £400 excl. lens, storage, etc.!)
- Good image resolution (target detail such as competitor numbers - 720p)
- Suitable for slow and fast moving targets (60mph +)
- Quick to set up on location
- Handle busy scenes (multiple targets e.g. one target overtaking another)
MotivationNow, I know it certainly wouldn't be the first camera-based speed detection solution but CHDK allows it to be done with cameras which you can get for less than £30 on eBay! ... I also know it's not too difficult to build Arduino-based speed detectors where the moving targets physically trigger simple sensors such as a laser beam but these methods often involve tedious equipment set-up and sometimes the hardware placement is impractical due to the location.
Failed AttemptsI started off trying to get two of my cameras (A810 & SX200) to take two images is quick succession but I couldn't get anywhere near the minimum 3FPS I needed for it to be really useful with fast moving targets. I tried various tricks from this forum, including digital teleconverter, low ISO, fast SD cards, manual settings, shoot_half, etc. but never achieved much better than about 1.5 frames per second. I then bought a SX220 with fast continuous shooting but this raised the next issue. I needed the exact timestamp of each photo with millisecond accuracy, in order to get accurate results. All my attempts here failed miserably and I couldn't see any solution other than having some sort of physical millisecond clock display in the scene. The SX220 also has a CMOS sensor which raised yet another issue (see background below).
ProgressThe method I settled for uses code from the excellent Manual Exposure Control for Video script (videxp3) by fudgey, waterwingz & msl to increase the video shutter speed. Setting the Tv to 1/1000 produces frames with very little motion blur, even when targets like cars are moving at 60mph at medium range. Removing the IR cut filter helped a bit with the low light performance at these high shutter speeds and it's easy to do to many Powershot cameras. To use video for speed calculations, I still needed the frames to be timed with millisecond accuracy but I wasn't sure these low cost cameras would be precise enough. So I made a crude millisecond display (described below) and filmed it at 1/1000 using my two CCD sensor cameras. The A810 used 25FPS and SX200 at 30FPS. To my surprise, both cameras only drifted about 1ms every 60 seconds and every frame interval was perfectly timed. The drift might even be due to the Crystal Oscillator, which tends to be a bit temperature sensitive.
A bit more workOne of the few CHDK challenges I still have to address involves reducing the camera FPS. With 720p resolution at the camera's native frame rate, the video files are massively oversized for the requirements and it's limiting any extended operation. The object tracking and subsequent speed calculations in OpenCV can be done efficiently at 5FPS so it will drastically reduce the storage and processing overhead if I can get the camera to record at 5FPS. At the moment, I simply discard 4 out of 5 frames from the 25fps video clips in openCV. A very exciting post by funnel about results he achieved controlling the FPS in video with a SX220HS (100a) showed this is possible, but I'll need to figure out how to replicate the same for one of my CCD cameras. It involves hunting for register values and disabling audio which is daunting for someone like me with no disassembly experience. I'll add a post in his thread to see if someone would be kind enough to give me a few pointers.
OpenCVI'll post info about the OpenCV development once it starts to yield useful results, if anyone is interested. I'm using Ubuntu 12.04 and Qt for the OpenCV development.
CHDK Rocks!Finally, I have to take my hat off to everyone in this CHDK community. Great job!
I'm fairly technically minded but I’m certainly no expert in any of the subject areas of this project so any ideas or feedback would be most welcome.
Just some further background:My millisecond clock (picture attached)To test the video frame rate accuracy, I built a crude millisecond display.
All you need is:
1 x IQXO-22C - 32.7680MHz Crystal Oscillator
1 x M74HC4020B1R - 14 Stage Binary Counter (to divide the frequency down to 2000Hz)
2 x CD74HC4518E - Dual BCD Synchronous Counter
12 x LEDs and Current Limiting Resistors
Decoupling Capacitors (optional)
The 14 stage binary counter divides the oscillator frequency down to 2000Hz. The two dual BCD counters gives you a total of 4. Use the first stage of the first counter to divide the frequency one more time to get 1000Hz. The remaining three counters are then cascaded to drive 3 sets of LEDs showing the 1/1000, 1/100 and 1/10 values respectively.
Rolling ShutterThe main reason for using cameras with a CCD sensor is that they typically don't suffer from rolling shutter which would reduce the accuracy. Many machine vision cameras use CMOS sensors with global shutter features but that's not available in these low cost consumer cameras AFIK.
PrerequisitesTo allow accurate results from the video clips:
- the camera must remain in a fixed position
- the shutter speed must be high enough to eliminate motion blur
- focal length must remain static
- targets should move through the scene in a predictable straight line (roughly)
- a calibration target must be filmed once the camera is mounted and ready (see below)
CalibrationThe calibration target mentioned earlier is used to compensate for the parallax effect and perspective distortion of the real world 3D scene in the 2D image. It also provide a way to superimpose reference distance measurements into the scene, used to calculate distance travelled between 2 frames for example. It can even be used to compensate for lens distortions from wide angle or fish-eye lenses, although this shouldn't be required with most Powershot cameras as the firmware already applies these corrections to the JPEG. The calibration target is simply a flat surface of suitable size with a chequered pattern like a chess board. You typically only need about 5x5 squares. This calibration target is then filmed in the scene where the real targets are expected to appear. The orientation can be vertical or horisontal, depending on the relative position of the camera. Once you've captured a few frames with the target in appropriate positions, it can be removed from the scene. In some cases, you may not need an artificial calibration target, as long as the shape, size and orientation of your real targets (or other objects in the scene) are know and suitable.