Kameramodul des Raspberry Pi, V4L-Treiber (Video4Linux) und motion
Das Kameramodul des Raspberry Pi funktioniert gut und liefert gar nicht mal so schlechte Bilder für so einen Winzling. Ich bin zwar noch nicht fertig mit meinen Spielereien (Bildervergleich mit Smartphone, Table, DSLR), wunderte mich aber, ob das Kameramodul auch mit motion funktioniert.
motion ist eine Open-Source-Software, die unter anderem Bewegung erkennen kann. Dazu vergleicht es, wie viele Pixel sich im Bild geändert haben. Das kann man konfigurieren.
Das Problem mit dem Kameramodul des Raspberry Pi ist, dass motion /dev/videoX oder ein Gerät benötigt, das mit dem Treiber V4L / Video4Linux funktioniert. Es gibt eine speziell angepasste Version von motion mit der ich allerdings nicht ganz glücklich bin.
Update: In der Zwischenzeit ist es viel einfacher, den V4l-Treiber zum Laufen zu bekommen. Er ist bereits in Raspbian enthalten. Nach der Installation der Kamera-Hardware musst Du lediglich sudo modprobe bcm2835-v4l2
aufrufen und solltest dann ein Gerät /dev/video0 haben. Soll das Gerät gleich beim Start vorhanden sein, dann füge die Zeile bcm2835-v4l2 in der Datei /etc/modules ein. Es könnte auch sein, dass das Laden des Treibers v4l2_common zuerst notwendig ist (modprobe v4l2_common
) und danach bcm2835-v4l2. Du findest das heraus, indem Du auf der Kommandozeile des Raspberry Pi den Befehl lsmod
ausführst. Danach solltest Du ein Gerät /dev/video0 haben.
Bei der weiteren Suche bin ich auf ein Projekt gestoßen, das einen Userspace-Video4Linux-Treiber für Raspbian zur Verfügung stellt.
Der Treiber ist recht schnell installiert:
Zunächst editierst Du die Datei /etc/apt/sources.list und fügst folgende Zeile ein:
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
Danach sind auf der Kommandozeile folgende Befehle notwendig (Ich gehe von einem komplett aktualisierten Raspbian aus):
wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
- Optional (dann startet sich der Treiber bei Systemstart):
sudo apt-get install uv4l-raspicam-extras
Du kannst den Treiber wie folgt manuell laden:
uv4l --driver raspicam --auto-video_nr --width 640 --height 480 --encoding jpeg
und dann einen Screenshot machen:
dd if=/dev/video0 of=snapshot.jpeg bs=11M count=1
Möchtest Du die Treiber “on the fly” ändern, geht das auch. dazu ist zunächst das Paket v4l-utils notwendig:
sudo apt-get install v4l-utils
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat="H264" -d /dev/video0
und ein Video mit zehn Sekunden Länge ließe sich so aufnehmen:
dd if=/dev/video0 of=video.h264 bs=1M & pid=$! ; sleep 10; kill $pid
Das funktioniert alles sehr gut, bei motion musst Du allerdings LD_PRELOAD bemühen (sudo ist nur notwendig, weil bei einer Standard-Installation von motion nur root die Datei /etc/motion/motion.conf lesen kann):
sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion
oder eben mit Angabe Deiner eigenen motion-Konfigurations:
sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /Pfad/zu/motion.conf
Per Standard lässt sich das über http://localhost:8081 überprüfen. Möchtest Du das von einem anderen Computer aus tun, musst Du in der Konfigurations-Datei den Parameter webcam_localhost on auf webcam_localhost off setzen.
Auch ein Streamen wäre möglich:
uv4l --driver raspicam --auto-video_nr --width 640 --height 480
cd mjpg-streamer
export LD_LIBRARY_PATH="$(pwd)"
LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 320x240 -f 30" -o "output_http.so -w ./www"
Den Stream findest Du dann unter http://<IP-Adresse oder Name des Raspberry Pi>:8080/stream.html
oder mit VLC
sudo apt-get install vlc
Laut Angaben des Entwicklers ist eine gute Konfiguration für den Server 352×288 bei zehn fps:
uv4l --driver raspicam --auto-video_nr --framerate 10
cvlc v4l2:///dev/video0 --v4l2-width 352 --v4l2-height 288 --sout '#transcode{vcodec=MJPG,width=352,height=288,vb=1000}:duplicate{dst=std{access=http{mime=multipart/x-mixed-replace;boundary=--7b3cc56e5f51db803f790dad720ed50a},mux=mpjpeg,dst=:8080/video.mjpg}'
Auf dieser Seite findest Du noch weitere Anwendungs-Beispiele. Zum Beispiel wie man einen RealTime Streaming Server (RTSP) realisieren kann.
Ich bin ziemlich froh, dass dieser Treiber existiert und ich das Kameramodul recht problemlos nun mit motion betreiben kann. Das Kameramodul für das Raspberry Pi kombiniert mit motion reagiert auf Bewegung, wie man das erwartet und schießt saubere Bilder. Das macht die Sache doch um einiges kompakter und ich kann weiter an meinem Spyfan basteln … :).
Auf jeden Fall ist es nun möglich, eine recht kompakte und sehr günstige Überwachungs-Kamera zu basteln. Die Zutaten sind Raspberry Pi, Kameramodul, Linux (Raspbian) und wer möchte eine WLAN-Karte.
Nette Pi-Konstellation
Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.
Hi,
super Tutorial! Wenn ich das nur mal ein paar Tage früher gefunden, hätte ich einige Stunden einsparen können.
Gruß
Hi, danke erst einmal fürs Tutorial, jetzt hätte ich da noch eine Frage, vielleicht kannst du mir da weiterhelfen. Ich habe alles so installiert wie oben beschrieben, nutze die Kamera jetzt allerdings als Bewegungsmelder... Bewegung wird erkannt und ein GPIO geschaltet. Mein Problem ist jetzt, dass über HDMI das Kamerabild ausgegeben wird. Kennst du eine Möglichkeit das zu ändern? Bei raspicamvid kann ich ja mit dem Schalter -n die Vorschau abschalten, hier gelingt es mir nicht.
LG
Carsten
Das weiß ich leider nicht ...
Hallo zusammen,
erstmal danke für das Tutorial.
Ich nutze derzeit motion auf dem raspi mit der speziellen mmal-Konfig und bin auch nicht so richtig glücklich.
Mich würde noch interessieren, wie hoch ich die Auflösung maximal drehen kann bei der von dir gezeigten Lösung.
Bei der mmal-Lösung ist bei knapp über 1000x500 irgendwas schluss.
Viele Grüße
Flo
@Flo:
Meine mmal Cam läuft seit Monaten in voller Auflösung, d.h.:
# Image width (pixels). Valid range: Camera dependent, default: 352
width 2560
# Image height (pixels). Valid range: Camera dependent, default: 288
height 1920
Wie kommst du auf 1000x500Pixel?
Hallo Jürgen,
danke für die Anleitung. Mich hat es auch schon immer genervt mit der mmal-Lösung zu arbeiten.
Eine Frage habe ich aber, wie kann ich das ganze automatisch starten lassen?
Ich muss ja quasi manuell "sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf" aufrufen.
Hallo,
über die Datei /etc/rc.local kannst Du Skripte bei Systemstart ausführen lassen. Das sollte funktionieren. In diesem Fall solltest Du allerdings den vollen Pfad für motion angeben und das sudo brauchst Du nicht. Wo sich motion genau befindet, findest Du mit which motion heraus.
Hoffe das hilft.
Viele Grüße,
Jürgen
Hallo Jürgen,
danke für die schnelle Antwort. Am liebsten wäre es mir wenn ich den Motion Dienst weiterhin ganz normal bedienen könnte.
Reicht es nicht eventell diese Zeile ganz am Anfang starten zu lassen
LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so
und motion dann ganz normal als Deamon von Haus aus starten zu lassen?
Hallo,
Das schätze ich geht nicht - das heißt, es kommt darauf an, ob der motion-Daemon vor oder nach rc.local aufgerufen wird. rc.local wird aber erst nach allen anderen Init-Scripten ausgeführt. Ich kann es gerade nicht überprüfen, da mein RasPi anderweitig im Einsatz ist. Allerdings fallen mir spontan zwei Möglichkeiten ein:
1. Du modifizierst das Start-Script von motion. Das kann aber unschön bei Updates sein.
2. Du überprüfst mit einem Cronjob, ob motion bereits läuft. Sollte das nicht der Fall sein - starte es. Nachteil hier ist halt, dass dauernd ein Cronjob läuft - der sollte aber nicht viel Ressourcen fressen.
Einfach ein bisschen ausprobieren.
hello again,
ich kam heute noch mal zum konfigurieren. Dabei ist mit aufgefallen das die Bilder mit "deinem" Treiber extrem verwaschen sind.
Mache ich mit raspistill eine Aufnahme ist das Bild gewohnt scharf. Eine Ahnung warum?
pi@camrpi27 ~ $ sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf
[14096200] Processing thread 0 - config file /etc/motion/motion.conf
[14096200] Motion 3.2.12 Started
[14096200] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478785
[0] Thread 1 is from /etc/motion/motion.conf
[0] motion-httpd/3.2.12 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8080
[1] Thread 1 started
[1] cap.driver: "raspicam"
[1] cap.card: "Camera Board OV5647"
[1] cap.bus_info: "CSI"
[1] cap.capabilities=0x05000001
[1] - VIDEO_CAPTURE
[1] - READWRITE
[1] - STREAMING
[1] Test palette YU12 (2560x1920)
[1] Using palette YU12 (2560x1920) bytesperlines 3840 sizeimage 7372800 colorspace 00000000
[1] found control 0x00980900, "brightness", range 0,100
[1] "brightness", default 50, current 50
[1] found control 0x00980901, "contrast", range -100,100
[1] "contrast", default 0, current 0
[1] found control 0x00980902, "saturation", range -100,100
[1] "saturation", default 0, current 0
[1] found control 0x08000000, "shutter speed", range 0,65535
[1] "shutter speed", default 0, current 0
[1] found control 0x08000001, "zoom factor", range 1,8
[1] "zoom factor", default 0, current 1
[1] mmap information:
[1] frames=4
[1] 0 length=7372800
[1] 1 length=7372800
[1] 2 length=7372800
[1] 3 length=7372800
[1] Using V4L2
[1] Resizing pre_capture buffer to 1 items
[1] Started stream webcam server in port 8081
[1] Resizing pre_capture buffer to 3 items
Eine wilde Vermutung, die ich nicht belegen kann 🙂 Video Frames müssen nicht gestochen scharf sein. Es ist manchmal sogar dienlich eine kleine Bewegungsunschärfe zu haben, da es im Video dann flüssiger aussieht. Vielleicht ist die Belichtungszeit oder Verschlusszeit (shutter speed) relativ langsam.
Oder ist das Bild auch verwaschen bei statischen Objekten?
Moin moin,
mein motion ist so konfiguriert das es nur Bilder aufnimmt, keine Videos, da ich die volle Auflösung der Cam benötige.
Ich denke Bilder sagen mehr als Worte:
RPi mit Cam ohne IR Filter mit deinem Motiontreiber:
ssus.de/downloads/motion.jpg
RPi mit Cam ohne IR Filter mit raspistill:
ssus.de/downloads/raspistill.jpg
RPi mit Cam mit IR-Filter mit mmal Motion:
ssus.de/downloads/motion-irfilter.jpg
Was mir noch auffällt ist der Zoomfaktor beim Aufruf deines Treibers, eventuell ist deswegen das Bild reingezoomter?
pi@camrpi27 ~ $ sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf
[17368904] Processing thread 0 - config file /etc/motion/motion.conf
[17368904] Motion 3.2.12 Started
[17368904] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478785
[0] Thread 1 is from /etc/motion/motion.conf
[0] motion-httpd/3.2.12 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8080
[1] Thread 1 started
[1] cap.driver: "raspicam"
[1] cap.card: "Camera Board OV5647"
[1] cap.bus_info: "CSI"
[1] cap.capabilities=0x05000001
[1] - VIDEO_CAPTURE
[1] - READWRITE
[1] - STREAMING
[1] Test palette YU12 (2560x1920)
[1] Using palette YU12 (2560x1920) bytesperlines 3840 sizeimage 7372800 colorspace 00000000
[1] found control 0x00980900, "brightness", range 0,100
[1] "brightness", default 50, current 50
[1] found control 0x00980901, "contrast", range -100,100
[1] "contrast", default 0, current 0
[1] found control 0x00980902, "saturation", range -100,100
[1] "saturation", default 0, current 0
[1] found control 0x08000000, "shutter speed", range 0,65535
[1] "shutter speed", default 0, current 0
[1] found control 0x08000001, "zoom factor", range 1,8
[1] "zoom factor", default 0, current 1
[1] mmap information:
[1] frames=4
Digitaler Zoom wirkt sich immer auf die Qualität von Bildern aus (digitaler Zoom ist auch Blödsinn, interpolieren kannst Du selbst, wenn notwendig). Zoome Dein Raspi-Still-Bild mal auf 170 Prozent in GIMP, dann hast Du ungefähr die selben Größenverhältnisse wie bei dem Motion-Bild. Da ist von der Qualität aber nicht viel Unterschied. Das deckt sich auch mit der Zeile: "zoom factor", range 1,8 ...
Aber die Frage bleibt woher der Zoomfaktor kommt? Ich finde keine Einstellungen dazu in der motion.conf
Den Zoom-Faktor sollte der Treiber übermitteln und nicht motion. Bringt v4l2-ctl was?
v4l2-ctl --list-ctrls --device /dev/video0
Wie teste ich das?7
Habe bisher nur den Treiber "installiert":
'''Optional (dann startet sich der Treiber bei Systemstart): sudo apt-get install uv4l-raspicam-extras
Und dann eben mit
sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf
gestartet.
Ist v4l2-ctl installiert? Das sollte im Paket v4l-utils sein. Wenn ja, dann einfach mal aufrufen.
Das mit dem Zoom factor hatte ich falsch interpretiert. Der gibt nicht an, dass er 1,8 zoomt, sondern dass er von 1-8 könnte.
Hmmm, ok, dann wissen wir immer noch nicht warum er "zoomt".
Habt den Befehl mal aufgerufen, aber es ändert sich nix:
pi@camrpi27 ~ $ v4l2-ctl --list-ctrls --device /dev/video0
brightness (int) : min=0 max=100 step=1 default=50 value=50
contrast (int) : min=-100 max=100 step=1 default=0 value=0
saturation (int) : min=-100 max=100 step=1 default=0 value=0
horizontal_mirror (bool) : default=0 value=0
vertical_mirror (bool) : default=0 value=0
sharpness (int) : min=-100 max=100 step=1 default=0 value=0
shutter_speed (int) : min=0 max=65535 step=1 default=0 value=0
zoom_factor (int) : min=1 max=8 step=1 default=0 value=1
iso_sensitivity (int) : min=0 max=800 step=50 default=400 value=400
awb_mode (menu) : min=0 max=9 default=0 value=0
exposure_mode (menu) : min=0 max=11 default=0 value=1
exposure_metering (menu) : min=0 max=3 default=0 value=0
pi@camrpi27 ~ $ sudo LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf
Hallo Carsten,
ich bin jetzt ein Stück weiter...
In der motion.conf kann man ja die Auflösung konfigurieren.
Bis 1600x1200 gibt es das volle Bild.
Ab 1920x1200, bzw. irgendwo dazwischen wird das Bild digital aufgezoomt.
Hallo,
danke für das Tutorial - es hat mir einiges an Arbeit erspart...
Have Fun,
Thomas
Ich baue gerade ein über html gesteuertes auto mit schwenkbarer kamera auf ddem dach welche einenLivestream an diese HTML Seite senden soll.nun bastle ich an diesem Stream mit dem mitgeliefertem raspberry pi und der mitgelieferten PiCam herum. Der Webserver läuft bereits doch der Stream funktioniert noch nicht da die Kamera noch nicht über Motion und Den treiber angesprochen wird. Ich habe den Treiber bereits nach deiner Anleitung installiertaber nun will ich ihn mit motion gleichzeitig bei jedem Systemstart starten lassen. Im Moment Macht die Kamera die ganze Zeit Fotos beziehungsweise Videos und die LED blinkt ständig. Sie arbeitet ständig. Ich bin nich Anfänger und weiß nicht was ich tun soll. Hättest du vllt eine idee?
Bei Raspbian kannst Du über die Datei /etc/rc.local zum Beispiel Dinge bei Systemstart ausführen lassen. Hier allerdings die Befehle immer mit dem ganzen Pfad angeben. Wo sich zum Beispiel motion genau befindet (der Pfad) findest Du heraus, indem Du auf der Kommandozeile which motion ausführst. Aber auch bei motion wird die Kamera dauernd aktiv sein.
Moin,
danke für das Tutorial.
Ich verwende die neue WebRTC Extension mit dem UV4L Treiber und dem HTTP Server um einen kontinuierlichen Live Stream von meinem Pi aus zu senden. Das funktioniert soweit auch recht gut.
Um jedoch zu verstehen was genau abläuft wollte ich mir die Code´s einmal ansehen.
Clientseitig kann ich mir den Sourcecode auch anschauen, jedoch fehlt mir jegliche Information über den Code der auf dem Server läuft
Oder ist der UV4L-Server Code auch garnicht OpenSource?
Hallo,
Danke für deine Mühe.
Habe auch einen Raspi V1.1 mit Kamera Modul und selbstgebautem FTP Upload. Motion braucht leider bei Bewegungserkennung 100% CPU Zeit was dazu führt das der raspi bei einer von mir eingestellten Auflösung von 800x600 völlig überfordert ist und meist nur alle 2 Sekunden wenn überhaupt ein Bild macht. Das Problem ist wohl das alles über die sehr schwache CPU läuft und die GPU des Raspis, die eigentlich in Hardware Videos codieren könnte, es nicht tut. Ergo läuft der Raspi zwar seit 6 Monaten bei mir damit aber nicht sehr zuverlässig...Habe überlegt auf Raspi2 mit Quad Core umzusteigen, glaube aber nicht das es das bringt.
Falls jemand sagen kann wie Motion mit KameraModul auf dem Raspi2 Quad COre läuft (Auflösung, FPS) bitte gerne melden Aber wer kauft sich schon ein FullHD Kamera Modul um dann wegen schwachbrüstiger CPU Bilder mit 320x200 zu machen da der Raspi sonst überfordert ist, schade. Werde nun wohl leider auf potentere Hardware umsteigen müssen mit normaler FullHD Webcam.
ich bekomme den v4lTreiber nicht geladen
er findet ihn einfach nicht
E: Paket uv4l kann nicht gefunden werden.
E: Paket uv4l-raspicam kann nicht gefunden werden.
ob ich vorher update upgade oder rpi update nix
ich habe schon jessi runtergeschmissen und wheezy installiert
hat alles nix gebracht
Gruss Frank
Wenn das Paket nicht gefunden werden kann, dann hat sich das Repository nicht sauber eingebunden. Was hast Du denn bisher gemacht? Genaue Schritte bitte. Bei mir funktioniert das genau so wie beschrieben. Oftmals sind es die kleinen Fehler, die man leicht übersieht...
Hallo,
habe die Raspicam installiert und bin genau nach Anleitung vorgegangen aber es wird kein Modul dev/video0 angelegt. Damit funktioniert auch dann motion nicht beim Streaming
Der Beitrag ist relativ alt. In der Zwischenzeit wollte der Treiber in Raspbian enthalten sein.
[…] DDONAUER, JÜRGEN: Kameramodul des Raspberry Pi, V4L-Treiber (Video4Linux) und motion. https://www.bitblokes.de/kameramodul-des-raspberry-pi-v4l-treiber-video4linux-und-motion/ […]