ein freies Lehrmittel auf der Basis von eduskript

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

  1. Öffnen Sie die Video-App Ihres Smartphones
  2. Aktivieren Sie den Blitz (Dauerlicht, nicht Blitz-Modus)
  3. Legen Sie den Zeigefinger so über die Kamera, dass sowohl Linse als auch Blitz bedeckt sind
  4. 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ählen

Am 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:

  1. Öffnen Sie Visual Studio Code
  2. Öffnen Sie ein Terminal: Klicken Sie im Menü auf Terminal → Neues Terminal
    • Es öffnet sich ein Fenster am unteren Bildschirmrand
  3. Geben Sie folgenden Befehl ein und drücken Sie Enter:
    pip install opencv-python
    
  4. 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

  1. Ordner erstellen: Erstellen Sie einen neuen Ordner für Ihr Projekt, z.B. PPG-Projekt
  2. Video kopieren: Kopieren Sie Ihr aufgenommenes Video in diesen Ordner
  3. Script speichern: Speichern Sie den Python-Code als farbwerte_exportieren.py im gleichen Ordner

Ihr Ordner sollte so aussehen:

PPG-Projekt/
├── farbwerte_exportieren.py
└── mein_video.mp4

Schritt 2: Code anpassen

  1. Öffnen Sie VS Code und öffnen Sie Ihren Projektordner (Datei → Ordner öffnen)
  2. Öffnen Sie das Script farbwerte_exportieren.py
  3. 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-Dateiname

Der Dateiname muss exakt übereinstimmen, inklusive Gross-/Kleinschreibung und Dateiendung (.mp4, .mov, etc.)

Schritt 3: Script ausführen

  1. Terminal öffnen: Terminal → Neues Terminal (oder Ctrl+ö)
  2. Script starten: Tippen Sie folgenden Befehl ein und drücken Sie Enter:
    python farbwerte_exportieren.py
    
  3. 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-python ausführen

Anleitung: Daten in Excel importieren

Schritt 1: CSV-Datei öffnen

  1. Excel starten
  2. Datei öffnen: Datei → Öffnen → Durchsuchen
  3. Dateityp ändern: Unten rechts "Alle Dateien" oder "Textdateien" wählen
  4. farbwerte.csv auswählen und öffnen

Schritt 2: Import-Assistent (falls nötig)

Falls Excel den Import-Assistenten zeigt:

  1. Trennzeichen: "Komma" auswählen
  2. Datenvorschau prüfen – es sollten 5 Spalten sein
  3. Fertig stellen klicken

Ergebnis

Ihre Tabelle sollte so aussehen:

FrameZeit_sRotGruenBlau
602.000192.840.006.69
612.033193.160.006.71
622.067193.300.006.76
...............

Anleitung: Daten in Excel visualisieren

Schritt 1: Diagramm erstellen

  1. Daten markieren: Klicken Sie in Spalte B (Zeit_s), halten Sie Ctrl gedrückt und klicken Sie zusätzlich Spalte C (Rot)
  2. Gesamte Spalten wählen: Markieren Sie beide Spalten von der Überschrift bis zur letzten Zeile
  3. Diagramm einfügen: Einfügen → Diagramme → Punkt (XY) → Wählen Sie "Punkte mit geraden Linien"

Schritt 2: Diagramm formatieren

  1. Diagrammtitel: Doppelklick auf Titel → "PPG-Signal (Rot-Kanal)" eingeben
  2. Achsenbeschriftung hinzufügen:
    • Klicken Sie auf das Diagramm
    • +-Symbol rechts → "Achsentitel" aktivieren
    • X-Achse: "Zeit [Sekunden]"
    • Y-Achse: "Helligkeit (0-255)"
  3. 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
  1. Können Sie regelmässige Schwankungen (Wellen) erkennen?
  2. Wie viele "Berge" (Peaks) zählen Sie in einem 10-Sekunden-Abschnitt?
  3. 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 verwenden

Um 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äte

Smartwatches 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:

  1. Alle drei Farbkanäle im gleichen Diagramm darstellen und vergleichen
  2. Gleitenden Durchschnitt berechnen: Neue Spalte mit Formel =MITTELWERT(C2:C6) um das Signal zu glätten
  3. Standardabweichung berechnen um die Signalqualität zu bewerten