OpenCV (englische Abk. für Open Computer Vision) ist eine freie Programmbibliothek mit Algorithmen für die Bildverarbeitung und Computer Vision.
Die mediapipe-Beispiele verwenden OpenCV zur Darstellung und Bearbeitung von Bilder.
Zeichnen
Die im Beispiel verwendete Funktion draw_detection
zeichnet einen Rahmen und die erkannten keypoints. Möchte man etwas anderes Zeichnen, so muss man das selbst tun.
Wir finden die Funktion in der Datei drawing_utils.py
. Gezeichnet wird mit den Zeichenbefehlen von OpenCV. Zuerst aber müssen die relativen Koordinaten der keypoints mit einem Dreisatz in Pixel-Koordinaten konvertiert werden.
Hier eine leicht vereinfachte Variante der im Skript gefundenen Funktion _normalized_to_pixel_coordinates()
:
def to_pixel(normalized_x, normalized_y, image):
"""Converts normalized value pair to pixel coordinates."""
image_height, image_width, _ = image.shape
x_px = min(math.floor(normalized_x * image_width), image_width - 1)
y_px = min(math.floor(normalized_y * image_height), image_height - 1)
return x_px, y_px
keypoint = {"x": 0.3, "y": 0.93} # fiktiver keypoint erzeugen
pixel = to_pixel(keypoint.x, keypoint.y, image_cols, image)
Die Funktion erhält als Argumente zwei relative Koordinaten und das Bild (wegen der Bildgrösse). Zurückgeliefert wird das Tupel der errechneten Pixel-Koordinaten, welches direkt in den OpenCV-Zeichenfunktionen verwendet werden kann:
cv2.circle(image, pixel, 20, [255,0,0], 2)
Die Zeichenbefehle von OpenCV findet man hier:
Bildausschnitt
Man kann einen rechteckigen Ausschnitt des Bildes weiterbearbeiten. OpenCV behandelt Bilder wie zweidimensionale Listen – man wählt einfach eine Unterliste (y-Koordinate zuerst).
Bildbearbeitung
Z.B. können Bilder geglättet werden:
image = cv2.blur(image,(10,10))