Kameramodul des Raspberry Pi, V4L-Treiber (Video4Linux) und motion

22 Januar 2014 27 Kommentare Autor: Jürgen (jdo)

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

V4L-Treiber für Kamera-Modul des Raspberry Pi geladen

V4L-Treiber für Kameramodul des Raspberry Pi geladen

und dann einen Screenshot machen:

dd if=/dev/video0 of=snapshot.jpeg bs=11M count=1

V4L-Treiber für Kamera-Modul des Raspberry Pi geladen und Snapshot erstelle

V4L-Treiber für Kameramodul des Raspberry Pi geladen und Snapshot erstelle

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

Raspberry Pi am Ventilator festgemacht

Mein Spyfan

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.

Kamera eingesetzt: Rückseite

Kamera eingesetzt: Rückseite

Nette Pi-Konstellation

 

Du kannst gerne Deinen Senf zu diesem Beitrag geben: Hier geht es zu den Kommentaren




Schreiben macht durstig! Eine kleine Erfrischung kann daher nie schaden. Wem dieser freie Artikel gefallen hat, der darf mir gerne einen frisch gezapften Hopfen-Tee ausgeben (Paypal - der Spenden-Knopf
oder bitcoin - Adresse: 1NacVNwcLLePUVv8uSafu5Ykdwh8QyDfgK). Ich freue mich über jede noch so kleine Spende. Vielen Dank und Prost!
 Alle Kommentare als Feed abonnieren

27 Kommentare zu “Kameramodul des Raspberry Pi, V4L-Treiber (Video4Linux) und motion”

  1. Patrick sagt:

    Hi,

    super Tutorial! Wenn ich das nur mal ein paar Tage früher gefunden, hätte ich einige Stunden einsparen können.

    Gruß

  2. Carsten sagt:

    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

  3. Flo sagt:

    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

    • Stefan sagt:

      @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?

  4. Stefan sagt:

    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.

    • jdo sagt:

      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

      • Stefan sagt:

        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?

        • jdo sagt:

          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.

  5. stefan sagt:

    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

    • jdo sagt:

      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?

      • Stefan sagt:

        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

        • jdo sagt:

          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 ...

          • Stefan sagt:

            Aber die Frage bleibt woher der Zoomfaktor kommt? Ich finde keine Einstellungen dazu in der motion.conf

          • jdo sagt:

            Den Zoom-Faktor sollte der Treiber übermitteln und nicht motion. Bringt v4l2-ctl was?

            v4l2-ctl --list-ctrls --device /dev/video0

          • Stefan sagt:

            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.

          • jdo sagt:

            Ist v4l2-ctl installiert? Das sollte im Paket v4l-utils sein. Wenn ja, dann einfach mal aufrufen.

          • jdo sagt:

            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.

          • Stefan sagt:

            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

  6. Stefan sagt:

    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.

  7. Thomas sagt:

    Hallo,

    danke für das Tutorial - es hat mir einiges an Arbeit erspart...

    Have Fun,
    Thomas

  8. Adrian sagt:

    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?

    • jdo sagt:

      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.

  9. Andre sagt:

    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?

  10. Martin sagt:

    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.

  11. frank sagt:

    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

    • jdo sagt:

      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...

Antworten