Ez elkerülhetetlen volt – az OpenCV 3 kiadásának meg kellett törnie a visszafelé kompatibilitást néhány OpenCV 2.4.X funkcióval: cv2.findContours
és cv2.normalize
jut eszembe rögtön a fejemből.
Hogyan biztosíthatod tehát, hogy a kódod működni fog, függetlenül attól, hogy az OpenCV melyik verzióját használja a termelési környezeted?
Nos, a rövid válasz az, hogy if
utasításokat kell létrehoznia minden egyes sérelmes függvény körül (vagy absztrahálni a függvényeket egy külön metódusba, amely az OpenCV verziója alapján kezeli a megfelelő függvény meghívását).
Hogy ezt megtehesse, képesnek kell lennie ellenőrizni az OpenCV verzióját a Python használatából – és pontosan ez az, amit a blog további része megmutatja, hogyan kell csinálni!
Keresed ennek a bejegyzésnek a forráskódját?
Ugorj rögtön a Letöltések részhez
Az OpenCV verziója egy speciális cv2.__version__
változóban található, amelyet így érhetsz el:
$ python>>> import cv2>>> cv2.__version__'3.0.0'
A cv2.__version__
változó egyszerűen egy karakterlánc, amelyet feloszthatsz a major és minor verzióra:
>>> (major, minor, _) = cv2.__version__.split(".")>>> major'3'>>> minor'0'
Az persze, hogy ezt a műveletet minden alkalommal el kell végezned, amikor az OpenCV verzióját ellenőrizni akarod, egy kicsit fájdalmas. Ennek a problémának a megoldására három új függvényt adtam az imutils csomagomhoz, egy sor kényelmi függvényt, amelyek megkönnyítik az alapvető képfeldolgozási funkciókat az OpenCV-vel és Pythonnal.
A is_cv2
, is_cv3
és check_opencv_version
függvényeimet alább láthatod:
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)
A kód itt meglehetősen egyszerű – egyszerűen ellenőrzöm, hogy a cv2.__version__
karakterlánc 2
-el kezdődik-e, ami azt jelzi, hogy OpenCV 2.X-et használunk, 3
-el, ami azt jelzi, hogy OpenCV 3-at használunk, vagy 4
-el, ami azt jelzi, hogy OpenCV 4-et használunk.
Az imutils csomagban már szerepelnek ezek a funkciók, amit a pip segítségével telepíthetünk:
$ pip install imutils
Ha már telepítve van a imutils
, akkor frissíthetünk a legújabb verzióra a következőkkel:
$ pip install --upgrade imutils
Az OpenCV verziójának ellenőrzése:
Most, hogy tudjuk, hogyan ellenőrizhetjük az OpenCV verzióját Python segítségével, valamint definiáltunk néhány kényelmi függvényt, hogy megkönnyítsük a verzióellenőrzést, nézzük meg, hogyan használhatjuk ezeket a függvényeket egy valós példában.
A célunk itt a kontúrok felismerése a következő képen:
A kép kontúrjainak felismeréséhez a cv2.findContours
függvényt kell használnunk. Mint tudjuk azonban, a cv2.findContours
visszatérési szignója kissé megváltozott az OpenCV 3. és 2.4. verziója között (a cv2.findContours
OpenCV 3-as verziója egy extra értéket ad vissza a tuplában) – így a cv2.findContours
hívása előtt el kell végeznünk egy ellenőrzést az OpenCV-verziónkban, hogy szkriptünk ne hibázzon. Nézzük meg, hogyan tudjuk ezt az ellenőrzést elvégezni:
# 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)
Amint láthatjuk, csak a is_cv2
, is_cv4
és is_cv3
hívást kell végrehajtanunk, majd a verzió-specifikus kódunkat a if
utasításblokkokba csomagolnunk – ennyi!
Most, amikor a szkriptemet az OpenCV 2.4-gyel akarom végrehajtani, az gond nélkül működik:
És ugyanez igaz az OpenCV 3-ra:
Összefoglaló
Ebben a blogbejegyzésben megtudtuk, hogyan ellenőrizhetjük az OpenCV verzióját Python segítségével. Az OpenCV verziót egy speciális, cv2.__version__
nevű string változó tartalmazza. Csak annyit kell tennünk, hogy ellenőrizzük ezt a változót, és máris meg tudjuk határozni az OpenCV verziónkat.
Végül definiáltam néhány kényelmi metódust az imutils csomagon belül, hogy az OpenCV verziójának ellenőrzése egyszerűbbé és Pythonosabbá váljon. Fontolja meg a könyvtár ellenőrzését, ha úgy találja, hogy következetesen ellenőriznie kell az OpenCV verziókat.