Sprint 4 · Datastructuren & foutafhandeling  ·  US4: Live besturing

Als piloot, wil ik de drone live met het toetsenbord besturen terwijl ik het camerabeeld met de belangrijkste waarden zie, zodat ik meteen kan bijsturen en de vlucht later kan terugkijken.

Taak 2: Video opnemen met VideoWriter

cv2.imshow() toont frames, maar slaat ze niet op. Met cv2.VideoWriter schrijf je elk frame naar een videobestand — terwijl de stream gewoon doorloopt.

Van tonen naar opslaan

Met cv2.imshow() zie je frames live op het scherm. Maar zodra de loop stopt, is alles weg. cv2.VideoWriter lost dit op: het schrijft elk frame naar een bestand terwijl de loop loopt.

Het 3-stap patroon

# Stap 1 — éénmalig aanmaken (vóór de loop)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = cv2.VideoWriter('opname.mp4', fourcc, 25.0, (640, 480))

# Stap 2 — elk frame schrijven (in de loop)
writer.write(frame)

# Stap 3 — afsluiten (na de loop)
writer.release()

Elk frame dat je doorgeeft aan writer.write() wordt direct naar het bestand geschreven. Na writer.release() is het bestand klaar om af te spelen.

De vier parameters van VideoWriter

cv2.VideoWriter(
    'opname.mp4',    # bestandsnaam
    fourcc,          # codec
    25.0,            # fps — frames per seconde
    (640, 480)       # (breedte, hoogte) van elk frame
)

De codec geeft je aan hoe frames gecomprimeerd worden. cv2.VideoWriter_fourcc(*'mp4v') is de meest gebruikte keuze voor .mp4-bestanden.

Kritische eis: de breedte en hoogte in de constructor moeten exact overeenkomen met de afmetingen van elk frame dat je doorgeeft. Klopt het niet, dan worden frames genegeerd en het bestand blijft leeg.

Demo: opname simulatie

Druk op REC om frames te schrijven naar het gesimuleerde bestand. Stop de opname om de bestandsstats te zien.

StatusNiet opgenomen
Frames0
Duur0.0 s
Bestandsgrootte0 KB
Bestand—
Vuistregel: maak de VideoWriter aan vóór de loop, roep write() aan in de loop, en release() na de loop. Vergeet release()? Dan is het bestand waarschijnlijk corrupt.

Python — Probeer het uit

Console: Klaar voor input…

Opdracht: opname aan/uit via toets

Je hebt uit T1 een drone-keyboard-loop die draait terwijl de stream actief is. De piloot wil nu ook kunnen opnemen: druk op R om de opname te starten, nog een keer R om te stoppen. Bestand: drone_record.py

import cv2
from djitellopy import Tello

tello = Tello()
tello.connect()
tello.streamon()
frame_read = tello.get_frame_read()

De drone streamt. Bouw de loop zodat de piloot tegelijk de drone kan besturen én een opname aan en uit kan zetten. Denk na over: wanneer je de writer aanmaakt (niet per frame), hoe je bijhoudt of de opname actief is, en hoe je op het juiste moment release() aanroept.

Acceptatiecriteria

  • Drukken op 'r' start de opname; opnieuw 'r' stopt en slaat het bestand op.
  • Tijdens opname toont de terminal elke seconde (elke ~30 frames) het aantal opgenomen frames.
  • Framegrootte voor de writer komt uit frame.shape, niet hardcoded.
  • 'q' stopt de loop — als er een actieve opname is, wordt die netjes afgesloten.
  • Het bestand opname.avi is na afloop afspeelbaar.