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 3: Tekst op frames met putText()

Sensorwaarden leven als Python-variabelen, maar zijn onzichtbaar op het scherm. Met cv2.putText() teken je tekst direct in een frame — zodat batterij, hoogte of snelheid live op het beeld verschijnt.

Sensordata zichtbaar maken op het frame

Je weet al hoe je frames toont met imshow() en opslaat met VideoWriter. Wat je nog niet kunt: tekst op het frame zelf zetten. cv2.putText() doet precies dat — het tekent tekst direct in de pixels van een frame.

De aanroep

cv2.putText(
    frame,                      # het frame — wordt direct aangepast
    f"CPU: {cpu_usage}%",       # de tekst (f-string werkt prima)
    (10, 30),                   # positie: (x, y) linker onderkant
    cv2.FONT_HERSHEY_SIMPLEX,   # lettertype
    0.7,                        # schaal (niet pixels, maar factor)
    (0, 255, 0),                # kleur: (Blauw, Groen, Rood)
    2                           # dikte in pixels
)

Let op de kleurvolgorde: OpenCV gebruikt BGR, niet RGB. Groen is (0, 255, 0) in beide — maar rood is (0, 0, 255), niet (255, 0, 0).

Twee kritieke details

  • putText() geeft niets terug — het past het frame ter plaatse aan. frame = cv2.putText(...) geeft None terug en wist je frame.
  • Meerdere regels vereisen meerdere putText()-aanroepen, elk met een grotere y-waarde.
cv2.putText(frame, f"CPU:  {cpu_usage}%",  (10, 30), font, 0.7, (0,255,0), 2)
cv2.putText(frame, f"MEM:  {mem_usage}%",  (10, 60), font, 0.7, (0,255,0), 2)
cv2.putText(frame, f"TEMP: {temp}°C",      (10, 90), font, 0.7, (0,255,255), 2)

Demo: OSD builder

Typ een sensorwaarde, kies een kleur en voeg toe. Zie direct het resultaat op het frame en de bijbehorende putText()-aanroep.

Tekst
Kleur (B, G, R)
Schaal
Aanroepen
BGR ≠ RGB — de meest gemaakte fout bij putText(). Groen klopt toevallig ((0,255,0)), maar rood en blauw zijn verwisseld. Onthoud: de volgorde is Blauw, Groen, Rood.
Vuistregel: roep putText() aan op het frame vóórdat je het doorgeeft aan imshow() of writer.write(). Dan staat de tekst zowel op het scherm als in de opname.

Python — Probeer het uit

Console: Klaar voor input…

Opdracht: live sensorpanel op het beeld

De drone vliegt en streamt video. De piloot wil zonder naar de terminal te kijken al weten hoe het met de drone gaat. Zorg dat batterij, hoogte en snelheid rechtsbovenin het videoframe verschijnen. Bestand: drone_osd.py

import cv2
from djitellopy import Tello

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

De stream loopt. Haal de sensorwaarden op via de Tello-methoden (get_battery(), get_height(), get_speed_x()), zet ze als tekst rechtsboven in het frame, en toon het frame. Denk na over: de positie (rechtsboven vraagt uitlijning), de kleurverantwoording en wanneer je de OSD toevoegt ten opzichte van imshow().

Acceptatiecriteria

  • Batterij, hoogte en snelheid zijn zichtbaar op het videoframe, niet alleen in de terminal.
  • De tekst staat rechtsboven in het frame (niet linksboven).
  • Alle drie waarden worden elke frame ververst met actuele sensordata.
  • 'q' stopt de loop en sluit het venster netjes af.
  • Het frame is nog steeds herkend als videoframe: imshow() werkt zonder fouten.