Az OpenCV verziójának ellenőrzése Python segítségével

opencv_versions_header

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:

1. ábra: Az OpenCV 2.4.X és az OpenCV 3 programot fogjuk használni a Tetris blokkok kontúrjainak felismerésére.
1. ábra: Az OpenCV 2.4.X és az OpenCV 3 programot fogjuk felhasználni a Tetris blokkok kontúrjainak (azaz körvonalainak) felismerésére.

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:

2. ábra: A cv2.findContours hívásunk működik az OpenCV 2.4.X-ben.
2. ábra: A cv2.findContours hívásunk működik az OpenCV 2-ben.4.X.

És ugyanez igaz az OpenCV 3-ra:

3. ábra: És ugyanez igaz az OpenCV 3-ra is, mivel az is_cv2 és is_cv3 függvényeket használjuk az OpenCV verziók Python segítségével történő felismerésére.
3. ábra: És ugyanez igaz az OpenCV 3 esetében is, mivel az is_cv2 és is_cv3 függvényeket használjuk az OpenCV verziók Python segítségével történő észlelésére.

Ö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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.