Raspberry Pi – Webcam gebruiken via USB
Naast de Raspberry ‘Camera module’ kun je ook webcams gebruiken op de raspberry pi om foto’s en video’s te maken, wel is de originele camera van de raspberry pi stukken beter dan een webcam!
Er zijn een aantal website’s die het beschrijven, hier is mijn ervaring om een webcam aan te sluiten op een raspberry pi.
Wat heb je nodig?
1) fswebcam (te installeren met sudo apt-get install fswebcam )
Wat is fswebcam (ENG)?
fswebcam is a neat and simple webcam app. It captures images from a V4L1/V4L2 compatible device or file, averages them to reduce noise and draws a caption using the GD Graphics Library which also handles compressing the image to PNG or JPEG.
Installatie
Begin met het installeren vna fswebcam met het commando: sudo apt-get install fswebcam
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: fswebcam 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 52.3 kB of archives. After this operation, 141 kB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main fswebcam armhf 20110717-1 [52.3 kB] Fetched 52.3 kB in 0s (88.8 kB/s) Selecting previously unselected package fswebcam. (Reading database ... 73326 files and directories currently installed.) Unpacking fswebcam (from .../fswebcam_20110717-1_armhf.deb) ... Processing triggers for man-db ... Setting up fswebcam (20110717-1) ... |
Foto maken
Een foto is eenvoudig te maken met het commando: fswebcam foto.jpg
Je kan zelfs het pad opgeven met de ‘–save‘ optie: fswebcam --save /tmp/foto.jpg
De resolutie kan je opgeven met -r, bijvoorbeeld -r 640x480
Een ander voorbeeld met meer commando’s om de camera in te stellen (mits ondersteund):
fswebcam -d /dev/video0 -S 2 -s brightness=60% -s Contrast=15% -s Gamma=50% -p YUYV -r 1280x720 --jpeg 80 -s Sharpness=40% -s Saturation=15% --title "New Zealand - Wellington - Tawa" $DIR/$filename
Webcam details en info
Om details en informatie te zien van de webcam zijn verschillende commando’s aanwezig:
1 2 3 4 5 6 7 |
Format Video Capture: Width/Height : 352/288 Pixel Format : 'P207' Field : None Bytes per Line: 352 Size Image : 101952 Colorspace : SRGB |
1 2 3 4 5 6 7 |
Format Video Capture: Width/Height : 352/288 Pixel Format : 'RGB3' Field : None Bytes per Line: 1056 Size Image : 304128 Colorspace : SRGB |
1 2 3 4 5 6 7 8 9 10 |
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Available Controls Current Value Range ------------------ ------------- ----- Brightness 46 (18%) 0 - 255 Exposure 5 (2%) 3 - 90 Gain, Automatic True True | False Gain 7 (22%) 0 - 31 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Available Controls Current Value Range ------------------ ------------- ----- Brightness 46 (18%) 0 - 255 Whitebalance (software) True True | False Gamma (software) 1500 (40%) 500 - 3000 Exposure 5 (2%) 3 - 90 Gain, Automatic True True | False Gain 7 (22%) 0 - 31 Horizontal flip (sw) False True | False Vertical flip (sw) False True | False Adjusting resolution from 384x288 to 352x288. |
Unable to find a compatible palette format
Bij oude (legacy) webcams kan je deze foutmelding krijgen:
1 2 3 4 5 |
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Unable to find a compatible palette format. |
Dit is op te lossen door een ‘oude compatible’ driver te gebruiken: libv4l/v4l1compat.so ,deze kun je laden met met LD_PRELOAD:
LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so
Ps. dit schijnt ook te werken:
LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l2convert.so
Als je dit nu voor de fswebcam commando zet, werkt de webcam wel:
LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so fswebcam --save /tmp/foto.jpg
1 2 3 4 5 6 7 8 9 |
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to '/tmp/foto.jpg'. |
VIDIOC_DQBUF error
Een VIDIOC_DQBUF error kan aan verschillende dingen liggen, de verbinding, het USB apparaat is nog niet gereed, of een andere oorzaak, hier is niets aan te doen, als je de webcam om de 10 a 20 seconden dan een foto laat maken zou er niets aan de hand moeten zijn.
Meer fswebcam opties
– Webcam, het ‘device pad’ naar de webcam, in te stellen met de ‘-d‘ optie:
-d /dev/video0
– Banner, deze kun je niet laten weergeven met de optie:
--no-banner
– Resolutie, deze kun je met de ‘-r‘ optie instellen:
-r 160x120
– Kwaliteit, de kwaliteit van de foto is in te stellen met ‘–jpeg‘, een voorbeeld voor 95%:
--jpeg 95
– Opslag, waarnaartoe de foto weggeschreven wordt is in te stellen met de ‘–save‘ optie:
--save /tmp/foto.jpg
Cronjob met snapshots via internet
Als je een webserver hebt geinstalleer op de raspberry pi kun je met een cron job een foto maken en deze weergeven via een internet browser, tevens wordt deze ook opgeslagen in het ‘archief’:
1) Maak een folder aan in /var/www genaamd ‘cam‘.
2) Maak een bestand aan in /usr/cron genaamd ‘camsnap.sh‘ (en geef deze uitvoeringsrechten)
1 2 3 4 5 6 |
#!/bin/bash DATE=$(date +"%Y-%m-%d_%H%M%S") LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so fswebcam --jpeg 95 --save /var/www/cam/foto.jpg cp /var/www/cam/foto.jpg /var/www/cam/archief/$DATE.jpg |
3) Als je nu het script uitvoert, wordt er een bestand aangemaakt:
/var/www/cam/foto.jpg en een bestand met ISO datum en tijd prefix in:
/var/www/cam/archief
4) met
crontab -e voeg deze regel toe om de cron om de minuut uit te voeren:
* * * * * /usr/cron/camsnap.sh 2>&1
5) Nu kun je bijvoorbeeld ‘index.html‘ gebruiken om de foto weer te geven:
1 |
<img src="foto.jpg"> |