PPG-Signal aufnehmen und visualisieren
Lernziele
- SuS können ein PPG-Signal mit dem Smartphone aufnehmen
- SuS können Videodaten in Python laden und als CSV exportieren
- SuS können die Daten in Excel importieren und visualisieren
- SuS erkennen das pulsierende Signal im Diagramm
Versuchsaufbau
Wir werden nun unser eigenes PPG-Signal aufnehmen – ganz ohne teure Technik! Alles was wir brauchen ist ein Smartphone mit Kamera und Blitz.
Material
- Smartphone mit Kamera und Blitz
- Computer mit Python und Visual Studio Code
- Microsoft Excel
- Finger (am besten Zeigefinger)
Warum der Blitz?
Der Blitz des Smartphones fungiert als unsere konstante, starke Lichtquelle – genau wie die grüne LED in einer Smartwatch. Das Licht dringt in die Haut ein und wird vom Blut absorbiert. Bei jedem Herzschlag ändert sich die Durchblutung und damit die Lichtreflektion.
Tipp zum Setup
- Finger muss sowohl Kamera als auch Blitz vollständig bedecken
- Gleichmässiger, sanfter Druck – nicht zu fest drücken
- Ruhig halten, nicht bewegen
Experiment: Video aufnehmen
Schritt 1: Aufnahme starten
- Öffnen Sie die Video-App Ihres Smartphones
- Aktivieren Sie den Blitz (Dauerlicht, nicht Blitz-Modus)
- Legen Sie den Zeigefinger so über die Kamera, dass sowohl Linse als auch Blitz bedeckt sind
- Starten Sie die Aufnahme
Schritt 2: Signal aufnehmen
- Nehmen Sie 20-30 Sekunden auf
- Halten Sie den Finger ruhig und gleichmässig auf der Kamera
- Üben Sie konstanten, sanften Druck aus
- Versuchen Sie sich beim ersten Versuch so wenig wie möglich zu bewegen!
Schritt 3: Video übertragen
Übertragen Sie das Video auf Ihren Computer (USB, Cloud, E-Mail, etc.)
Häufige Probleme
- Zu heller/dunkler Bildschirm: Finger-Druck anpassen
- Kein Blitz: Prüfen Sie die Einstellungen der Kamera-App
- Video zu kurz: Mindestens 20 Sekunden für gute Resultate
Python-Code: Signal extrahieren
Jetzt kommt der spannende Teil – wir laden das Video in Python und extrahieren die Farbinformationen!
"""
Farbwerte aus Video extrahieren und als CSV speichern
"""
import cv2
import csv
import os
# Ins Verzeichnis des Scripts wechseln
os.chdir(os.path.dirname(os.path.abspath(__file__)))
# KONFIGURATION
VIDEO_PFAD = "pulsmesser_demo.mp4"
CSV_PFAD = "farbwerte.csv"
START_SEKUNDE = 2 # None = ab Anfang
ENDE_SEKUNDE = 40 # None = bis Ende
# Video öffnen
video = cv2.VideoCapture(VIDEO_PFAD)
if not video.isOpened():
print(f"FEHLER: Konnte '{VIDEO_PFAD}' nicht öffnen!")
exit()
fps = video.get(cv2.CAP_PROP_FPS)
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# Zeitbereich berechnen
start_frame = int(START_SEKUNDE * fps) if START_SEKUNDE else 0
ende_frame = int(ENDE_SEKUNDE * fps) if ENDE_SEKUNDE else total_frames
video.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
print(f"Analysiere: {START_SEKUNDE}s bis {ENDE_SEKUNDE}s")
# CSV-Datei schreiben
with open(CSV_PFAD, 'w', newline='') as datei:
writer = csv.writer(datei)
writer.writerow(['Frame', 'Zeit_s', 'Rot', 'Gruen', 'Blau'])
for frame_nr in range(start_frame, ende_frame):
erfolg, frame = video.read()
if not erfolg:
break
# Durchschnittliche Farbwerte (BGR -> RGB)
blau = frame[:, :, 0].mean()
gruen = frame[:, :, 1].mean()
rot = frame[:, :, 2].mean()
zeit = frame_nr / fps
writer.writerow([frame_nr, f"{zeit:.3f}", f"{rot:.2f}", f"{gruen:.2f}", f"{blau:.2f}"])
if (frame_nr - start_frame) % 100 == 0:
print(f"{frame_nr - start_frame} / {ende_frame - start_frame} Frames...")
video.release()
print(f"\nFertig! {frame_nr} Frames -> {CSV_PFAD}")
Was passiert im Code?
Bibliotheken importieren
import cv2 # OpenCV: Video-Dateien lesen
import csv # CSV-Dateien schreiben
import os # Dateipfade verwalten
Konfiguration anpassen
VIDEO_PFAD = "pulsmesser_demo.mp4" # Name Ihres Videos
CSV_PFAD = "farbwerte.csv" # Ausgabedatei
START_SEKUNDE = 2 # Anfang überspringen
ENDE_SEKUNDE = 40 # Ende überspringen
Zeitbereich wählenAm Anfang und Ende der Aufnahme wird der Finger positioniert – diese Teile sind unbrauchbar. Wählen Sie nur den stabilen Mittelteil!
Farbwerte extrahieren
- Das Video wird Frame für Frame durchlaufen
- Für jedes Frame berechnen wir den Durchschnitt aller Pixel pro Farbkanal
- OpenCV speichert Farben als BGR (Blau-Grün-Rot), daher die Reihenfolge im Code
- Alle Werte werden in eine CSV-Datei geschrieben
Warum der Rot-Kanal?
Der Rot-Kanal zeigt meist die stärkste Variation, weil:
- Haut reflektiert rotes Licht sehr gut
- Blut absorbiert rotes Licht weniger stark als andere Farben
- Der Smartphone-Blitz ist warmweiss (viel Rot-Anteil)
Anleitung: Script ausführen mit Visual Studio Code
Voraussetzung: OpenCV installieren
Das Script benötigt die Bibliothek OpenCV zum Lesen von Videodateien. Diese ist nicht standardmässig in Python enthalten und muss einmalig installiert werden.
So installieren Sie OpenCV:
- Öffnen Sie Visual Studio Code
- Öffnen Sie ein Terminal: Klicken Sie im Menü auf
Terminal → Neues Terminal- Es öffnet sich ein Fenster am unteren Bildschirmrand
- Geben Sie folgenden Befehl ein und drücken Sie
Enter:pip install opencv-python - Warten Sie, bis die Installation abgeschlossen ist. Sie sehen am Ende eine Meldung wie:
Successfully installed opencv-python-4.x.x
Falls die Installation fehlschlägt
- "pip wurde nicht gefunden": Python ist möglicherweise nicht korrekt installiert. Fragen Sie Ihre Lehrperson.
- Berechtigungsfehler: Versuchen Sie
pip install --user opencv-python
Die Installation muss nur einmal durchgeführt werden. Danach bleibt OpenCV auf Ihrem Computer verfügbar.
Schritt 1: Projekt vorbereiten
- Ordner erstellen: Erstellen Sie einen neuen Ordner für Ihr Projekt, z.B.
PPG-Projekt - Video kopieren: Kopieren Sie Ihr aufgenommenes Video in diesen Ordner
- Script speichern: Speichern Sie den Python-Code als
farbwerte_exportieren.pyim gleichen Ordner
Ihr Ordner sollte so aussehen:
PPG-Projekt/
├── farbwerte_exportieren.py
└── mein_video.mp4
Schritt 2: Code anpassen
- Öffnen Sie VS Code und öffnen Sie Ihren Projektordner (
Datei → Ordner öffnen) - Öffnen Sie das Script
farbwerte_exportieren.py - Passen Sie die Konfiguration an (Zeilen 13-16):
VIDEO_PFAD = "mein_video.mp4" # ← Ihr Videoname hier!
CSV_PFAD = "farbwerte.csv"
START_SEKUNDE = 2 # ← Anpassen falls nötig
ENDE_SEKUNDE = 30 # ← Anpassen an Ihre Videolänge
Video-DateinameDer Dateiname muss exakt übereinstimmen, inklusive Gross-/Kleinschreibung und Dateiendung (
.mp4,.mov, etc.)
Schritt 3: Script ausführen
- Terminal öffnen:
Terminal → Neues Terminal(oderCtrl+ö) - Script starten: Tippen Sie folgenden Befehl ein und drücken Sie Enter:
python farbwerte_exportieren.py - Warten: Das Script zeigt den Fortschritt an. Bei einem 30-Sekunden-Video dauert es ca. 10-30 Sekunden.
Erfolgreiche Ausgabe:
Analysiere: 2s bis 30s
0 / 840 Frames...
100 / 840 Frames...
...
Fertig! 839 Frames -> farbwerte.csv
Häufige Fehler
FEHLER: Konnte 'xyz.mp4' nicht öffnen!→ Dateiname prüfen, Video im richtigen Ordner?ModuleNotFoundError: No module named 'cv2'→pip install opencv-pythonausführen
Anleitung: Daten in Excel importieren
Schritt 1: CSV-Datei öffnen
- Excel starten
- Datei öffnen:
Datei → Öffnen → Durchsuchen - Dateityp ändern: Unten rechts "Alle Dateien" oder "Textdateien" wählen
farbwerte.csvauswählen und öffnen
Schritt 2: Import-Assistent (falls nötig)
Falls Excel den Import-Assistenten zeigt:
- Trennzeichen: "Komma" auswählen
- Datenvorschau prüfen – es sollten 5 Spalten sein
- Fertig stellen klicken
Ergebnis
Ihre Tabelle sollte so aussehen:
| Frame | Zeit_s | Rot | Gruen | Blau |
|---|---|---|---|---|
| 60 | 2.000 | 192.84 | 0.00 | 6.69 |
| 61 | 2.033 | 193.16 | 0.00 | 6.71 |
| 62 | 2.067 | 193.30 | 0.00 | 6.76 |
| ... | ... | ... | ... | ... |
Anleitung: Daten in Excel visualisieren
Schritt 1: Diagramm erstellen
- Daten markieren: Klicken Sie in Spalte B (Zeit_s), halten Sie
Ctrlgedrückt und klicken Sie zusätzlich Spalte C (Rot) - Gesamte Spalten wählen: Markieren Sie beide Spalten von der Überschrift bis zur letzten Zeile
- Diagramm einfügen:
Einfügen → Diagramme → Punkt (XY)→ Wählen Sie "Punkte mit geraden Linien"
Schritt 2: Diagramm formatieren
- Diagrammtitel: Doppelklick auf Titel → "PPG-Signal (Rot-Kanal)" eingeben
- Achsenbeschriftung hinzufügen:
- Klicken Sie auf das Diagramm
+-Symbol rechts → "Achsentitel" aktivieren- X-Achse: "Zeit [Sekunden]"
- Y-Achse: "Helligkeit (0-255)"
- Linie färben (optional): Rechtsklick auf Linie → "Datenreihen formatieren" → Rot wählen
Schritt 3: Signal analysieren
Ihr Diagramm zeigt nun das PPG-Rohsignal! Schauen Sie genau hin:
Beobachtungsaufgaben
- Können Sie regelmässige Schwankungen (Wellen) erkennen?
- Wie viele "Berge" (Peaks) zählen Sie in einem 10-Sekunden-Abschnitt?
- Gibt es einen Trend (wird das Signal heller/dunkler über Zeit)?
Schritt 4: Herzfrequenz berechnen
Zählen Sie die Peaks in einem bestimmten Zeitabschnitt und rechnen Sie um:
Formel:
Herzfrequenz (bpm) = (Anzahl Peaks / Zeitabschnitt in Sekunden) × 60
Beispiel:
- 12 Peaks in 10 Sekunden gezählt
- Herzfrequenz = (12 / 10) × 60 = 72 bpm
Zoom verwendenUm die Peaks besser zu zählen: Doppelklick auf die X-Achse → Minimum und Maximum anpassen, um nur einen 10-Sekunden-Ausschnitt zu zeigen.
Herausforderungen
Ihr Signal ist wahrscheinlich verrauscht und hat langsame Schwankungen überlagert. Das ist normal! Diese Störungen entstehen durch:
- Atmung: Verändert den Blutdruck → langsame Wellen (~0.2 Hz)
- Bewegung: Kleine Handbewegungen verfälschen das Signal
- Drift: Helligkeitsänderungen über Zeit
- Quantisierung: Kamera hat begrenzte Helligkeitsauflösung
Professionelle GeräteSmartwatches verwenden ausgeklügelte Filter-Algorithmen, um diese Störungen zu entfernen. Dieses allgemeine Feld heisst "Signalverarbeitung".
Erweiterungen (optional)
Falls Sie mehr Zeit haben, können Sie in Excel:
- Alle drei Farbkanäle im gleichen Diagramm darstellen und vergleichen
- Gleitenden Durchschnitt berechnen: Neue Spalte mit Formel
=MITTELWERT(C2:C6)um das Signal zu glätten - Standardabweichung berechnen um die Signalqualität zu bewerten