Auf ein Display, etwa auf einen 3,5- oder 5-Zoll-HDMI-Monitor, verzichtet das Hardware-Konzept. Solche Bildschirme eignen sich für Außenaufnahmen ohnehin nicht besonders und verbrauchen zudem viel Energie. Das Netzwerk lässt sich leicht mittels eines lokalen Routers aufbauen. Kompakte Modelle messen nicht mehr als 5 x 5 cm und finden noch im Gehäuse Platz. Wer Zeitstempel in den Dateireferenzen benötigt, fügt noch einen RTC-Chip hinzu oder hängt ein GPS-Modul an.
Einrichten der Software-Umgebung
Mit einer Python-Programmierumgebung ist man gut ausgestattet. Ressourcen aus dem Internet zeigen auch dem Nichtprofi Problemlösungen auf. Zu den zusätzlich benötigten Bibliotheken zählen vorrangig PiCamera [2], das Interface zum Pi-Kameramodul, sowie die Computer-Vision-Bibliothek OpenCV. Die später zum Einsatz kommende GUI soll möglichst ohne Tastatureingaben auskommen, daher wäre noch Tkinter [3] zu installieren, die Sprachanbindung für das GUI-Toolkit.
Im Raspberry-Pi-Konfigurationsmenü sind die Kameraschnittstelle sowie SSH und der VNC-Server zu aktivieren. Unter Leistung gilt es, je nach Kamera gegebenenfalls den GPU-Speicher zu erhöhen. Der VNC-Server ist bei Raspbian gleich mit an Bord. Auf dem Host-PC benötigt man einen VNC-Viewer; entsprechende Programme gibt es für alle Betriebssysteme (etwa RealVNC [4] für Windows oder Remmina für Linux).
Die Netzanbindung des RasPi erzielt man durch Konfiguration der Datei /etc/wpa_supplicant.conf. Entsprechende Anleitungen liefert der Fundus von Raspberry Pi Geek [5]. Die IP-Adresse für den RasPi vergibt der Router. In dessen Oberfläche sollte man die IP für ein Gerät als fix definieren. Anschließend klappt die Anmeldung mit dem VNC-Viewer, sodass die RasPi-Oberfläche komfortabel auf dem PC zur Verfügung steht.
Das Kommando sudo apt install picamera richtet die Software für das Pi-Kameramodul ein. Bei korrekt eingebundener Kamera lässt sich anschließend über das Konsolenkommando raspistill -v -o test.jpg ein Testbild schießen. Durch den Parameter -v bekommen Sie dabei die benutzten Parameter ausführlich angezeigt. Mit 7 Sekunden dauert die Aufnahme einige Zeit, aber mit der entsprechenden Software-Strategie lässt sich später der Vorgang beschleunigen.
Von den Tutorien zur OpenCV-Installation sind die offizielle Dokumentation [6] sowie die Seite von PyImageSearch [7] empfehlenswert. Generell finden sich dort wertvolle Informationen über OpenCV. Ausgehend von einer bereits vollzogenen Installation von Raspbian und der Konfiguration von WLAN und SSH-Zugang lässt sich OpenCV in wenigen Schritten ins System einspielen. Es empfiehlt sich, die erfolgreiche Installation auch gleich zu testen. Am Ende lassen Sie sich aus der Python-Umgebung heraus die Versionsnummer ausgeben (Listing 1).
Listing 1
### Abhängigkeiten für OpenCV installieren: $ sudo apt install libhdf5-dev libhdf5-serial-dev $ sudo apt install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 $ sudo apt install install libatlas-base-dev $ sudo apt install install libjasper-dev ### Installation des Python Package Managers: $ wget https://bootstrap.pypa.io/get-pip.py $ sudo python3 get-pip.py $ sudo pip install opencv-contrib-python==4.1.0.25 ### Erster Test: Ausgabe der Versionsnummer $ python3 >>>import cv2 >>>cv2.__version__ '4.1.0'
Sie sollten bereits jetzt eine Dateistruktur festlegen. Die Software starten Sie aus einem Anwendungsverzeichnis, zum Beispiel rpiCamXX/, wobei XX für die letzten Stellen der IP-Adresse steht. Im Code taucht dieses Verzeichnis später als BASEDIR auf (siehe Listing 4, Zeile 6). Unterhalb dieser Ebene gibt es ein Verzeichnis photo/, in dem die aktuellen Bilddateien landen. Zur Datensicherung legen Sie nach einem Zufallscode ein Verzeichnis unterhalb der Ebene photo/ an, in das Sie die aktuellen Bilder verschieben. Der Aufruf der Komponenten erfolgt bequem über eine Desktop-Datei; ein Beispiel für das Modul für die Kameraausrichtung targetCam.py zeigt Listing 2.
Listing 2
[Desktop Entry] Name = targetCam Type = Application Comment = Kamera ausrichten Categories = Application Path = /home/pi/rpiCam75 Exec = python3 targetCam.py Terminal = true Icon = /home/pi/camera32.png X-KeepTerminal = true GenericName = target camera
Livebild, Ausrichtung und Belichtung
Das erste Software-Modul, mit dem wir uns auseinandersetzten, dient der Ausrichtung auf das Objekt und heißt targetCam.py (Listing 3). Das notwendige Livebild beschafft man sich über die Videofunktion der Kamera. In einer For-Schleife wird permanent ein Frame gestreamt (ab Zeile 24). Ein dem Frame überlagertes Gitternetz beziehungsweise Fadenkreuz dient als optische Referenz für weitere Bilder. Mit der OpenCV-Methode cv2.imshow() lässt sich der Frame anzeigen. Hat die Kamera das Ziel korrekt erfasst, verlässt man dieses Programm durch einen Druck auf [Q].
Listing 3
# Point camera to object with life image - targetCam.py
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
#
lThick, lColour,nw,nh,wPrev,hPrev = 1,(255,255,255),1,1,640,480
cam = PiCamera()
camIsOpen = True
cam.resolution = (wPrev, hPrev)
cam.framerate = 24
cam.rotation = 0
rawCapture = PiRGBArray(cam, size=(wPrev, hPrev))
time.sleep(1) # warm up
#
def drawGrid (img,w,h,lColour, lThick,dw,dh):
stepW = int(w/(dw+1))
stepH = int(h/(dh+1))
for x in range (w,0,-stepW):
cv2.line(img,(x,0), (x,h),lColour,lThick)
for y in range (h,0,-stepH):
cv2.line(img,(0,y), (w,y),lColour,lThick)
return
def main ():
global cam, camIsOpen
for frame in cam.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
drawGrid (image, wPrev, hPrev, lColour, lThick, nw, nh)
cv2.imshow("Quit&Shoot_with_q", image)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0) # clear stream
if key == ord("q"):
break
if camIsOpen:
cam.close()
camIsOpen = False
print ('bye')
main()
Zur Einstellung der Aufnahmeparameter dient eine GUI, die auf Tastatureingaben möglichst verzichtet (Abbildung 4). Vor Ort übernimmt meistens das Handy oder der Tablet-PC die Systemsteuerung, ein Notebook mit Tastatur wird man eher nicht dabeihaben. Eingabefelder für die Anzahl der Fotoserien, die Anzahl der Bilder pro Serie und die Zeitverzögerung zwischen den Aufnahmen lassen sich durch Mausklick beziehungsweise Fingertippen manipulieren. ISO-Wert, Messmodus, EV-Value, Belichtungszeit, Helligkeit und Sättigung werden ebenfalls über die GUI-Elemente eingestellt, gespeichert und im Testbild kontrolliert. Bei Bedarf setzt man darüber hinaus den Schalter refineBAK für die Korrektur der Objektivverzeichnung.
Auf ein Testbild in voller Auflösung kann man nicht immer verzichten. Auf einem kleinen Display benötigt man häufig die Zoom-Funktion, um die Bildqualität besser beurteilen zu können. Alle Werte werden als Dictionary behandelt und in der Datei camSettings.txt gespeichert. Ein Dictionary ordnet einem Schlüssel (key) immer einen Wert (value) zu und ist das probate Mittel zur Handhabung der Kameraparameter – gegebenenfalls kann man per Editor eingreifen. Ein Klick auf den Button SHOOT löst die Serienaufnahme aus.
Aufnahme von Serienbildern
Die Steuerung des Aufnahmevorgangs übernimmt der Code aus dem Python-Skript shootStills.py (Listing 4). Er liest die Kameraeinstellungen aus der Datei camSettings.txt und weist sie der Kamerainstanz cam zu. Die im Dictionary als String vorliegenden Werte müssen gegebenenfalls konvertiert werden. Bei einer mit 0 vorgegebenen Belichtungszeit übernimmt die Kamera die Automatik. Die Vorgehensweise geht von gleichbleibenden Lichtverhältnissen aus und nimmt alle Bilder mit konstanter Belichtung auf.






