Raspberry Pi IP Kamera (Teil 3)

Christoph Dähne09.12.2019

...oder wie ich eine Gegensprechanlage baute (Teil 3)

Wie man Hardware an einem Raspberry Pi per Browser ansteuern kann, steht im letzten Blog–Artikel. Diesmal geht es um die Kamera.

  • Wie kann ich eine Kamera anschließen und ansteuern?
  • Wie übertrage ich das Videobild über unseren Web Server?

Wie bisher verwende ich Python3. Selbstverständlich gibt es mehr als einen Weg, eine IP Kamera zu programmieren und das hier ist nur einer davon.

Ehrlich gesagt war ich über die vielen Probleme mit der Kamera sehr überrascht. Es gibt sehr gute Tutorials, die mir geholfen haben. Links findest du an den entsprechenden Stellen in diesem Artikel.

Kamera–Video im Browser

Das Kamera–Video soll per HTTP abgerufen werden können. Als Web–Server ist wieder Flask im Einsatz. Für das Video habe ich das Beispiel aus diesem super Tutorial auf den Raspberry übertragen.

#!/usr/bin/env python3 from WebServer import webServer import os if __name__ == '__main__': port = int(os.environ.get('PORT', '5000')) webServer.run(host='0.0.0.0', port=port, debug=True)
# WebServer.py from flask import Flask, render_template, Response from Camera import get_frame import time webServer = Flask(__name__) @webServer.route('/') def index(): return render_template('index.html') def gen(): while True: frame = get_frame() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') # at most 25 fps time.sleep(.04) @webServer.route('/camera_stream') def camera_stream(): return Response( gen(), mimetype='multipart/x-mixed-replace; boundary=frame')
# Camera.py from time import time import cv2 from picamera.array import PiRGBArray from picamera import PiCamera camera = False def get_frame(): global camera if not camera: camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 capture = PiRGBArray(camera, size=(640, 480)) camera.capture(capture, format="bgr") frame = capture.array result = cv2.imencode('.jpg', frame)[1].tobytes() return result
<!-- templates/index.html --> <html> <head> <title>Video Streaming Demonstration</title> </head> <body> <h1>Video Streaming Demonstration</h1> <img src="{{ url_for('camera_stream') }}"> </body> </html>

Anschließen des Kamera-Moduls

Ein einfaches Kamera-Modul lässt sich an zwei Stellen am Raspberry Pi anschließen: Display und Camera. Natürlich funktioniert die Kamera nur, wenn die am Camera-Anschluss steckt. Achte unbedingt darauf, dass das Kabel richtig herum eingesteckt ist.

Installation der Libraries mit Pip

So ähnlich wie in diesem Tutorial benutze ich OpenCV zum Ansteuern der Kamera. Auf meinem Laptop konnte ich die Libraries schnell installieren und loslegen.

pip3 install flask opencv-python

Auf dem Raspberry Pi sind gleich mehrere Hindernisse aufgetaucht.

Zu wenig Speicher auf SD Karte

Mit NOOBS kommen viele Pakete mit und die Speicherkarte war zu voll. Die größten Pakete, die für dieses konkrete Projekt nicht nötig sind, habe ich gelöscht.

dpkg-query --show --showformat='${Package;-30}\t${Installed-Size}\t${Status}\n' \ | sort -k 2 -n \ | grep " installed" apt-get remove \ libreoffice-sdbc-hsqldb \ libreoffice-report-builder \ libreoffice-sdbc-postgresql \ libreoffice-math \ libreoffice-base-drivers \ libreoffice-base-core \ libreoffice-l10n-en-gb \ libreoffice-report-builder-bin \ libreoffice-l10n-de \ libreoffice-style-galaxy \ libreoffice-java-common \ libreoffice-base \ libreoffice-style-tango \ libreoffice-writer \ libreoffice-help-en-gb \ libreoffice-help-de \ libreoffice-common \ libreoffice-core \ wolfram-engine \ scratch2 \ javascript-common \ libreoffice \ minecraft-pi \ nodejs \ nodejs-doc \ nodered \ perl \ ruby \ && apt autoremove

Aptitude–Pakete

Auf dem Raspberry sind einige Pakete vorinstalliert, andere nicht. Damit OpenCV funktioniert musste ich die folgenden Pakete installieren. Bei dem Raspberry Pi wird NumPy, eine Abhängigkeit von OpenCV, mit Aptitude installiert. Eine doppelte Installation mit Pip und Aptitude führt zu Fehlern. Daher musste ich die Pip-Variante entfernen.

Ob und wieso tensorflow nötig ist, bin ich mir nicht mehr sicher.

pip3 install flask opencv-python tensorflow apt install \ libcblas-dev \ libhdf5-dev \ libhdf5-serial-dev \ libatlas-base-dev \ libjasper-dev \ libqtgui4 \ libqt4-test pip3 uninstall numpy

Mit diesem Setup lässt sich endlich der IP–Kamera–Server starten. Trotzdem ist kein Bild zu sehen.

Kamera aktivieren

Das Kameramodul lässt sich nur ansteuern, wenn man die Kamera in den Raspberry Pi Einstellungen aktiviert. In der Raspi-Config ist das Punkt 5. Außerdem reicht der Speicher nicht aus. Den habe ich in Punkt 8 auf 128 MB erhöht.

sudo raspi-config
KI generiert: Das Bild zeigt ein kleines Kameramodul, das mit einem Flachbandkabel verbunden ist und über einem bunten Papierzylinder hängt. Im Hintergrund ist auf einem Bildschirm ein Bild zu sehen, das von der Kamera gestreamt wird.

Ich hoffe, dass dieser Artikel dir bei deinem Raspberry Pi Projekt hilft. Über Anregungen und Feedback freuen wir uns.

Bildquellen

Foto des Raspberry Pi 3 B+ von Gareth Halfacree from Bradford, UK - Raspberry Pi 3 B+, CC BY-SA 2.0

Dein Besuch auf unserer Website produziert laut der Messung auf websitecarbon.com nur 0,28 g CO₂.