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:
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:
Und dasselbe gilt für OpenCV 3:
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.