adesso Blog

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

Weitere spannende Themen aus der adesso-Welt findet ihr in unseren bisher erschienen Blog-Beiträgen.

Bild Alexej Kats

Autor Alexej Kats

Alexej ist seit 2022 als Senior Software Engineer bei adesso in Stuttgart tätig. Dort unterstützt er den Bereich Public als Entwickler im Java-Umfeld.

Kategorie:

Softwareentwicklung

Schlagwörter:

Python

OpenCV

Diese Seite speichern. Diese Seite entfernen.