Kontrola verze OpenCV pomocí Pythonu

opencv_versions_header

Bylo to nevyhnutelné – vydání OpenCV 3 muselo porušit zpětnou kompatibilitu s některými funkcemi OpenCV 2.4.X: cv2.findContours a cv2.normalize mě napadají hned zkraje.

Jak tedy zajistit, aby váš kód fungoval bez ohledu na to, jakou verzi OpenCV vaše produkční prostředí používá?

No, krátká odpověď je, že budete muset vytvořit příkazy if kolem každé z chybných funkcí (nebo abstrahovat funkce do samostatné metody, která se stará o volání příslušné funkce na základě vaší verze OpenCV).

Abyste to mohli udělat, budete muset být schopni zkontrolovat verzi OpenCV z vašeho používaného Pythonu – a to je přesně to, co vám zbytek tohoto blogu ukáže, jak to udělat!

Hledáte zdrojový kód k tomuto příspěvku?

Přejděte přímo do sekce ke stažení

Verze OpenCV je obsažena ve speciální proměnné cv2.__version__, ke které můžete přistupovat takto:

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

Proměnná cv2.__version__ je jednoduše řetězec, který můžete rozdělit na hlavní a vedlejší verzi:

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

Muset tuto operaci provádět pokaždé, když potřebujete zkontrolovat verzi OpenCV, je samozřejmě trochu otrava. Abych tento problém vyřešil, přidal jsem tři nové funkce do svého balíčku imutils, což je řada komfortních funkcí, které usnadňují základní funkce zpracování obrazu pomocí OpenCV a Pythonu.

Níže si můžete prohlédnout mé funkce is_cv2 , is_cv3 a check_opencv_version:

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)

Kód je zde poměrně jednoduchý – jednoduše kontroluji, zda řetězec cv2.__version__ začíná znakem 2 , což znamená, že používáme OpenCV 2.X, znakem 3 , což znamená, že používáme OpenCV 3, nebo znakem 4 , což znamená, že používáme OpenCV 4.

Tyto funkce již byly zahrnuty do balíčku imutils, který můžete nainstalovat pomocí pip:

$ pip install imutils

Pokud již máte nainstalovanou imutils, můžete provést upgrade na nejnovější verzi pomocí:

$ pip install --upgrade imutils

Zkontrolujte si verzi OpenCV: Nyní, když víme, jak zkontrolovat verzi OpenCV pomocí Pythonu, a také jsme definovali několik pomocných funkcí, které nám kontrolu verze usnadní, podívejme se, jak můžeme tyto funkce použít v reálném příkladu.

Naším cílem je detekovat obrysy na následujícím obrázku:

Obrázek 1: K detekci obrysů bloků Tetrisu využijeme OpenCV 2.4.X a OpenCV 3. Obrázek 2: K detekci obrysů bloků Tetrisu využijeme OpenCV 2.4.X.
Obrázek 1: Využijeme OpenCV 2.4.X a OpenCV 3 k detekci kontur (tj. obrysů) bloků Tetrisu.

Pro detekci kontur v obrázku budeme muset použít funkci cv2.findContours. Jak však víme, návratová signatura funkce cv2.findContours se mezi verzemi 3 a 2.4 softwaru OpenCV mírně změnila (verze cv2.findContours softwaru OpenCV 3 vrací v tuple další hodnotu) – proto budeme muset před voláním funkce cv2.findContours provést kontrolu naší verze softwaru OpenCV, aby náš skript nevykazoval chybu. Podívejme se, jak můžeme tuto kontrolu provést:

# 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)

Jak vidíte, stačí provést volání is_cv2 , is_cv4 a is_cv3 a pak zabalit náš kód specifický pro verzi uvnitř bloků příkazu if – to je vše!

Nyní, když jdu spustit svůj skript pomocí OpenCV 2.4, funguje bez problému:

Obrázek 2: Naše volání cv2.findContours funguje v OpenCV 2.4.X.
Obrázek 2: Naše volání cv2.findContours funguje v OpenCV 2.4.X.
.4.X.

A totéž platí pro OpenCV 3:

Obr. 3: A totéž platí pro OpenCV 3, protože používáme funkce is_cv2 a is_cv3 pro zjišťování verzí OpenCV pomocí Pythonu.
Obrázek 3: A totéž platí i pro OpenCV 3, protože ke zjišťování verzí OpenCV pomocí Pythonu používáme funkce is_cv2 a is_cv3.

Shrnutí

V tomto příspěvku jsme se naučili zjišťovat verzi OpenCV pomocí Pythonu. Verze OpenCV je obsažena ve speciální řetězcové proměnné s názvem cv2.__version__ . Stačí, když tuto proměnnou zkontrolujeme, a budeme schopni zjistit naši verzi OpenCV.

Nakonec jsem uvnitř balíčku imutils definoval několik komfortních metod, které nám usnadní kontrolu verze OpenCV a budou více pythonovské. Zvažte vyzkoušení této knihovny, pokud zjistíte, že potřebujete důsledně kontrolovat verze OpenCV.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.