Since spring has almost arrived, I wanted to check how many birds are still coming to my feeder before removing it from the balcony. Good to have a Raspberry Pi for counting our feathered friends!
There are several ways to detect motion with a Raspberry Pi. The best and most popular method is connecting a PIR sensor, which detects the infrared radiation emitted or reflected from an object. Motion can be also detected by image processing of webcam frames with a software called motion. However, image processing requires CPU power, which is limited on a Raspberry Pi. Furthermore, motion detection with a webcam depends on decent light-conditions and may be triggered from inanimate objects, such as trees or leaves moved by the wind.
Here I wanted to test whether it is possible to count bird visits using an infrared light barrier. I had both a photo diode and a high power infrared LED lying around in my tool box (SFH230-FA and SFH4550). Consider this project as a “proof-of-principle” build and be aware that there are more reliable ways for detecting motion!
Since the SFH4550 has a narrow emission angle of 3°, I designed a circuit which allows to sense the light reflected by an obstacle which moves into the IR beam. The setup is very similar to IR range sensors used in robotics. The detection range is about 30 cm, which is decent to monitor the space within the bird feeder. Furthermore, the diodes are about 0.64 € each, which is much cheaper than a ready-to-use IR distance shield.
Continue reading RasPi Bird-O-Matic/ Bird Photo Booth
Several weeks of testing revealed that my Python script for time-dependent webcam control works quite reliable. However, there were a few over-/or underexposed images close to sunset or sunrise. Turning off auto-exposure during daytime helped to prevent overexposed pictures, especially on bright and sunny days.
These fixed exposure settings resulted in too dark images on rainy and cloudy days. Since most webcams are optimized for indoor use, it is safe to use auto-exposure settings under these weather conditions. But how to let a script decide about that? For this purpose, I adopted the ImageStat function of the Python Imageprocessing Library (PIL), which allows to calculate an average arbitrary value for brightness. If it drops below a certain threshold level, auto-exposure settings are activated. Before calculation of brightness, the image is converted to gray-scale. The whole operation is done in memory, without the need to save a temporary file to disk.
Time-dependent webcam control
For taking still images with a webcam looking outside my sleeping room window, I’ve attached a Logitech C510 to my RasPi. At first, I used the fswebcam program to acquire still images, which can be easily configured using a fswebcam.conf file as follows:
quiet device v4l2:/dev/video0
set "White Balance Temperature, Auto"=1
set "Exposure, Auto"=3
set "Backlight Compensation"=1
timestamp "%d-%m-%Y %H:%M:%S (%Z)"
Some settings required careful tweaking, since most webcams are optimized for indoor use. Although the settings above resulted in pictures of reasonable quality, I noticed that they were pretty much overexposed on bright sunny days. And they were far too dark at night. It turned out that the auto exposure function of my webcam is unable to deal with changing light conditions.
Therefore I did some research on how to change the settings dynamically, depending on time of day. It turned out to be a simple task using some python scripting.