C’était inévitable – la version 3 d’OpenCV devait rompre la rétrocompatibilité avec certaines fonctions d’OpenCV 2.4.X : cv2.findContours
et cv2.normalize
me viennent à l’esprit tout de suite.
Alors, comment vous assurer que votre code fonctionnera quelle que soit la version d’OpenCV utilisée par votre environnement de production ?
Eh bien, la réponse courte est que vous devrez créer des déclarations if
autour de chacune des fonctions incriminées (ou abstraire les fonctions vers une méthode séparée qui gère l’appel de la fonction appropriée en fonction de votre version d’OpenCV).
Pour ce faire, vous devrez être en mesure de vérifier votre version d’OpenCV à partir de votre utilisation de Python – et c’est exactement ce que le reste de ce blog vous montrera comment faire !
Vous cherchez le code source de ce post ?
Sautez directement à la section des téléchargements
La version d’OpenCV est contenue dans une variable spéciale cv2.__version__
, à laquelle vous pouvez accéder comme ceci :
$ python>>> import cv2>>> cv2.__version__'3.0.0'
La variable cv2.__version__
est simplement une chaîne de caractères que vous pouvez diviser en versions majeure et mineure :
>>> (major, minor, _) = cv2.__version__.split(".")>>> major'3'>>> minor'0'
Bien sûr, devoir effectuer cette opération chaque fois que vous avez besoin de vérifier votre version d’OpenCV est un peu pénible. Pour résoudre ce problème, j’ai ajouté trois nouvelles fonctions à mon package imutils, une série de fonctions de commodité pour faciliter les fonctions de base de traitement d’images avec OpenCV et Python.
Vous pouvez voir mes fonctions is_cv2
, is_cv3
, et check_opencv_version
ci-dessous :
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)
Le code ici est assez simple – je vérifie simplement si la chaîne cv2.__version__
commence par un 2
, indiquant que nous utilisons OpenCV 2.X, un 3
, pour indiquer que nous utilisons OpenCV 3, ou un 4
, pour indiquer que nous utilisons OpenCV 4.
Encore, ces fonctions ont déjà été incluses dans le paquetage imutils, que vous pouvez installer à l’aide de pip:
$ pip install imutils
Si vous avez déjà imutils
installé, vous pouvez passer à la dernière version en utilisant:
$ pip install --upgrade imutils
Vérification de votre version d’OpenCV : un exemple concret
Maintenant que nous savons comment vérifier notre version d’OpenCV en utilisant Python ainsi que définir quelques fonctions de commodité pour faciliter la vérification de la version, voyons comment nous pouvons utiliser ces fonctions dans un exemple concret.
Notre objectif ici est de détecter les contours dans l’image suivante :
Pour détecter les contours dans une image, nous allons devoir utiliser la fonction cv2.findContours
. Cependant, comme nous le savons, la signature de retour de cv2.findContours
a légèrement changé entre la version 3 et 2.4 d’OpenCV (la version OpenCV 3 de cv2.findContours
renvoie une valeur supplémentaire dans le tuple) – nous devrons donc effectuer une vérification de notre version d’OpenCV avant d’effectuer un appel à cv2.findContours
pour nous assurer que notre script n’échoue pas. Regardons comment nous pouvons effectuer cette vérification :
# 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)
Comme vous pouvez le voir, tout ce que nous devons faire est d’effectuer un appel à is_cv2
, is_cv4
, et is_cv3
et ensuite envelopper notre code spécifique à la version à l’intérieur des blocs d’instructions if
– c’est tout !
Maintenant, quand je vais exécuter mon script en utilisant OpenCV 2.4, il fonctionne sans problème:
Et il en est de même pour OpenCV 3:
Summary
Dans cet article de blog, nous avons appris comment vérifier notre version d’OpenCV en utilisant Python. La version d’OpenCV est incluse dans une variable de chaîne spéciale nommée cv2.__version__
. Tout ce que nous devons faire est de vérifier cette variable et nous serons en mesure de déterminer notre version OpenCV.
Enfin, j’ai défini quelques méthodes de commodité à l’intérieur du package imutils pour rendre la vérification de votre version OpenCV plus facile et plus Python. Envisagez de vérifier la bibliothèque si vous vous trouvez dans l’obligation de vérifier systématiquement les versions d’OpenCV.