Überprüfen der OpenCV-Version mit Python

opencv_versions_header

Es war unvermeidlich – die Veröffentlichung von OpenCV 3 musste die Abwärtskompatibilität mit einigen OpenCV 2.4.X Funktionen aufheben: cv2.findContours und cv2.normalize fallen mir da spontan ein.

Wie stellen Sie also sicher, dass Ihr Code funktioniert, egal welche Version von OpenCV Ihre Produktionsumgebung verwendet?

Nun, die kurze Antwort ist, dass Sie if Anweisungen um jede der fehlerhaften Funktionen herum erstellen müssen (oder die Funktionen in eine separate Methode abstrahieren, die den Aufruf der entsprechenden Funktion basierend auf Ihrer OpenCV-Version handhabt).

Um dies zu tun, müssen Sie in der Lage sein, Ihre OpenCV-Version aus Ihrem Python heraus zu überprüfen – und genau das wird Ihnen der Rest dieses Blogs zeigen!

Suchen Sie den Quellcode zu diesem Beitrag?

Springen Sie direkt zum Abschnitt Downloads

Die OpenCV-Version ist in einer speziellen cv2.__version__-Variable enthalten, auf die Sie wie folgt zugreifen können:

$ python>>> import cv2>>> cv2.__version__'3.0.0'

Die cv2.__version__-Variable ist einfach eine Zeichenkette, die Sie in die Haupt- und Nebenversion aufteilen können:

>>> (major, minor, _) = cv2.__version__.split(".")>>> major'3'>>> minor'0'

Natürlich ist es etwas mühsam, diese Operation jedes Mal durchführen zu müssen, wenn Sie Ihre OpenCV-Version überprüfen wollen. Um dieses Problem zu lösen, habe ich drei neue Funktionen zu meinem imutils-Paket hinzugefügt, eine Reihe von Komfortfunktionen, um grundlegende Bildverarbeitungsfunktionen mit OpenCV und Python zu vereinfachen.

Die is_cv2 , is_cv3 und check_opencv_version Funktionen sind unten zu sehen:

def is_cv2(): # if we are using OpenCV 2, then our cv2.__version__ will start # with '2.' return check_opencv_version("2.")def is_cv3(): # if we are using OpenCV 3.X, then our cv2.__version__ will start # with '3.' return check_opencv_version("3.")def is_cv4(): # if we are using OpenCV 3.X, then our cv2.__version__ will start # with '4.' return check_opencv_version("4.")def check_opencv_version(major, lib=None): # if the supplied library is None, import OpenCV if lib is None: import cv2 as lib # return whether or not the current OpenCV version matches the # major version number return lib.__version__.startswith(major)

Der Code hier ist ziemlich einfach – ich überprüfe einfach, ob die cv2.__version__ Zeichenkette mit einem 2 beginnt, was anzeigt, dass wir OpenCV 2.X verwenden, einem 3, was anzeigt, dass wir OpenCV 3 verwenden, oder einem 4, was anzeigt, dass wir OpenCV 4 verwenden.

Auch diese Funktionen sind bereits im Paket imutils enthalten, das Sie mit pip installieren können:

$ pip install imutils

Wenn Sie bereits imutils installiert haben, können Sie auf die neueste Version aktualisieren, indem Sie:

$ pip install --upgrade imutils

Ihre OpenCV-Version überprüfen: Ein reales Beispiel

Nun, da wir wissen, wie wir unsere OpenCV-Version mit Python überprüfen können und auch einige Komfortfunktionen definiert haben, um die Versionsprüfung zu vereinfachen, wollen wir sehen, wie wir diese Funktionen in einem realen Beispiel verwenden können.

Unser Ziel ist es, Konturen im folgenden Bild zu erkennen:

Abbildung 1: Wir werden OpenCV 2.4.X und OpenCV 3 verwenden, um die Konturen der Tetris-Blöcke zu erkennen.
Abbildung 1: Wir werden OpenCV 2.4.X und OpenCV 3 verwenden, um die Konturen (d.h. Umrisse) der Tetris-Blöcke zu erkennen.

Um die Konturen in einem Bild zu erkennen, müssen wir die Funktion cv2.findContours verwenden. Wie wir jedoch wissen, hat sich die Rückgabesignatur von cv2.findContours zwischen Version 3 und 2.4 von OpenCV leicht geändert (die OpenCV 3-Version von cv2.findContours gibt einen zusätzlichen Wert im Tupel zurück) – daher müssen wir vor dem Aufruf von cv2.findContours eine Überprüfung unserer OpenCV-Version durchführen, um sicherzustellen, dass unser Skript keinen Fehler macht. Schauen wir uns an, wie wir diese Prüfung durchführen können:

# import the necessary packagesfrom __future__ import print_functionimport imutilsimport cv2# load the Tetris block image, convert it to grayscale, and threshold# the imageprint("OpenCV Version: {}".format(cv2.__version__))image = cv2.imread("tetris_blocks.png")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)# check to see if we are using OpenCV 2.X or OpenCV 4if imutils.is_cv2() or imutils.is_cv4():(cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# check to see if we are using OpenCV 3elif imutils.is_cv3():(_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# draw the contours on the imagecv2.drawContours(image, cnts, -1, (240, 0, 159), 3)cv2.imshow("Image", image)cv2.waitKey(0)

Wie Sie sehen, müssen wir nur is_cv2 , is_cv4 und is_cv3 aufrufen und dann unseren versionsspezifischen Code in die if Anweisungsblöcke einbetten – das ist alles!

Wenn ich nun mein Skript mit OpenCV 2.4 ausführe, funktioniert es ohne Probleme:

Abbildung 2: Unser Aufruf von cv2.findContours funktioniert in OpenCV 2.4.X.
Abbildung 2: Unser Aufruf von cv2.findContours funktioniert in OpenCV 2.4.X.

Und dasselbe gilt für OpenCV 3:

Abbildung 3: Und dasselbe gilt für OpenCV 3, da wir die Funktionen is_cv2 und is_cv3 verwenden, um OpenCV-Versionen mit Python zu erkennen.
Abbildung 3: Und das Gleiche gilt für OpenCV 3, da wir die Funktionen is_cv2 und is_cv3 verwenden, um OpenCV-Versionen mit Python zu erkennen.

Zusammenfassung

In diesem Blogbeitrag haben wir gelernt, wie wir unsere OpenCV-Version mit Python überprüfen können. Die OpenCV-Version ist in einer speziellen String-Variable namens cv2.__version__ enthalten. Alles, was wir tun müssen, ist, diese Variable zu überprüfen, und wir werden in der Lage sein, unsere OpenCV-Version zu bestimmen.

Schließlich habe ich ein paar bequeme Methoden innerhalb des imutils-Pakets definiert, um die Überprüfung Ihrer OpenCV-Version einfacher und pythonischer zu machen. Ziehen Sie die Bibliothek in Betracht, wenn Sie die OpenCV-Versionen ständig überprüfen müssen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.