16. August 2023 von Alexej Kats
Einfache Bildverarbeitung mit Python und der OpenCV-Bibliothek
Python ist eine beliebte Programmiersprache, die vor allem im Bereich des maschinellen Lernens eingesetzt wird. Ein großer Vorteil von Python ist, dass es eine umfangreiche Sammlung von Open-Source-Bibliotheken wie NumPy, TensorFlow, OpenCV gibt. Dieser Blog-Beitrag gibt einen Überblick über einige Möglichkeiten der Bibliothek OpenCV.
OpenCV-Bibliothek
OpenCV wurde ursprünglich von Intel entwickelt und ist heute eine der am weitesten verbreiteten Bibliotheken im Bereich des maschinellen Sehens. OpenCV bietet eine breite Palette von Funktionen und Algorithmen für die Verarbeitung und Analyse von Bildern und Videos. Es enthält Module für grundlegende Operationen wie das Lesen und Schreiben von Bildern, das Ändern der Bildgröße, das Zeichnen von Formen und das Anwenden von Filtern. Darüber hinaus bietet OpenCV fortgeschrittene Funktionen wie Gesichtserkennung, Objektverfolgung, Merkmalsextraktion, Abstandsmessung und Kamerakalibrierung. OpenCV ist in C++ geschrieben, bietet aber auch Schnittstellen zu vielen anderen Programmiersprachen wie Python und Java. Dadurch kann OpenCV leicht in verschiedene Projekte und Anwendungen integriert werden.
Python-Projekt mit OpenCV aufsetzen
Mit Hilfe der OpenCV-Bibliothek soll eine einfache Diashow aus mehreren Bildern erstellt werden. Diese Diashow soll aus zwei Bildern eine Videodatei erstellen, die ähnliche Effekte wie in Powerpoint verwendet.
Um die OpenCV-Bibliothek verwenden zu können, müssen wir sie zunächst installieren. Dies kann zum Beispiel mit dem Paketverwaltungsprogramm für Python Pip und dem Befehl:
pip install opencv-python
Mit diesem Schritt installieren Sie die neueste Version von OpenCV, bis zum 10.07.2023 ist dies die Version 4.8.0.74.
Wie ein Video aus dem Bild erstellt wird
Als erstes wird ein Bild mit OpenCV eingelesen und angezeigt. Das Bild muss sich im Projektverzeichnis im Ordner “images” befinden und “image1.jpg” heißen. Nun erstellen wir ein Python-Skript und nennen es zum Beispiel “Slideshow.py”.
import cv2
img1 = cv2.imread("images/image1.jpg", cv2.IMREAD_COLOR)
height, width, layers = img1.shape
video_name = 'Slideshow.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(video_name, fourcc, 1, (width, height))
video.write(img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Hier verwenden wir die Funktion cv2.imread()
, um das Bild einzulesen, und die Funktion cv2.VideoWriter()
mit den folgenden Parametern (const String &filename, int fourcc
, double fps, Size frameSize, bool isColor=true), um aus diesem Bild eine Videodatei mit dem Namen “Slideshow.mp4” zu erstellen. Als Videocodec wird in diesem Beispiel “mp4” verwendet, fps (frames per second) wird auf 1 gesetzt, frameSize wird auf die Breite und Länge des Bildes “image1” gesetzt. Die Liste der möglichen Videocodecs ist unter https://learn.microsoft.com/en-us/windows/win32/medfound/video-fourccs zu finden. Eine weitere Funktion von OpenCV, die wir verwenden, ist video.write()
, die ein Bild zum Video hinzufügt.
Video mit Fading-Effekt
In der OpenCV-Bibliothek gibt es viele Möglichkeiten, ein Bild zu verändern. Zum Beispiel ist es möglich, ein Bild auszublenden und ein anderes Bild einzublenden. Dieser Effekt wird in Powerpoint “Fading” genannt. Dazu verwenden wir die Funktion addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
aus OpenCV.src1
ist das erste Bild, src2
ist das zweite Bild. alpha
ist der Transparenzwert für das erste Bild, beta
ist der Transparenzwert für das zweite Bild. gamma
ist eine Konstante, die zum Transparenzindex der beiden Bilder addiert werden kann, wir setzen sie auf 0. Je kleiner alpha
beziehungsweise beta
ist, desto transparenter ist das entsprechende Bild, die möglichen Werte liegen zwischen 0 und 1. Als nächstes schreiben wir eine Methode, die das erste Bild stufenweise ausblendet und das zweite Bild einblendet. Es ist sehr wichtig, dass die beiden Bilder die gleiche Größe haben, sonst gibt es eine Fehlermeldung beim Ausführen des Programms. Unser Programm sieht nun so aus:
import cv2
img1 = cv2.imread("images/image1.jpg", cv2.IMREAD_COLOR)
img2 = cv2.imread("images/image2.jpg", cv2.IMREAD_COLOR)
video_name = 'slideshow.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
height, width, layers = img1.shape
video = cv2.VideoWriter(video_name, fourcc, 1, (width, height))
def verblassen(img1, img2, index):
dest = cv2.addWeighted(img2, 1 - index, img1, index , 0.0)
return dest
steps = [0, 0.5, 1]
for step in steps:
img_changed = verblassen(img1, img2, step)
video.write(img_changed)
cv2.waitKey(200)
cv2.destroyAllWindows()
Wir haben die Funktion verblassen()
geschrieben, die, je größer der index
-Parameter ist, das erste Bild ausblendet und das zweite sichtbar macht. Das resultierende Bild wird dem Video hinzugefügt. Hier setzen wir die Verzögerung beim Bildwechsel mit cv2.waitKey(200)
auf 200 Millisekunden, um den Bildwechsel zu verlangsamen. Wir rufen die Funktion dreimal auf, um das Ergebnis der Bildumwandlung besser sehen zu können.
Video mit einem “Blur”-Effekt
Um das Bild zu blurren, verwenden wir die Funktion cv2.blur(src, ksize[, dst[, anchor[, borderType]])
. Mit der Funktion blur()
kann ein Bild verwischt oder geglättet werden. Sie wird verwendet, um störende Details zu reduzieren oder Rauschen zu entfernen, indem die Pixelwerte im Bild verwischt werden. Die Funktion blur()
akzeptiert zwei Parameter: das Eingabebild (src)
und die Größe des Kernelfensters (ksize)
, die angibt, wie stark das Bild verwischt werden soll. Als nächstes schreiben wir die Funktion, die das Bild unscharf macht. Dann rufen wir die Funktion dreimal auf, jedes Mal mit größeren Parametern, um die Schärfe des Bildes zu verringern und so den “Blur”-Effekt zu erhalten.
def bluren(img, video, ksize):
blurred = cv2.blur(img, (ksize))
video.write(blurred)
kernelSizes = [(3, 3), (6, 6), (9, 9)]
for (kX, kY) in kernelSizes:
bluren(img1, video, (kX, kY))
Fazit
Wir haben gesehen, wie einfach es ist, mit Python und der OpenCV-Bibliothek ein Video aus mehreren Bildern zu erstellen. Außerdem haben wir zwei Videoeffekte mit nur wenigen Zeilen Code implementiert. Neben den gezeigten Funktionen bietet die OpenCV-Bibliothek noch viele weitere Möglichkeiten zur Bild- und Videobearbeitung