OpenCV-version tarkistaminen Pythonilla

opencv_versions_header

Se oli väistämätöntä – OpenCV 3:n julkaisun oli pakko rikkoa taaksepäin yhteensopivuus joidenkin OpenCV 2.4.X:n toimintojen kanssa: cv2.findContours ja cv2.normalize tulevat heti mieleen.

Miten siis varmistat, että koodisi toimii riippumatta siitä, mitä OpenCV-versiota tuotantoympäristösi käyttää?

Lyhyt vastaus on, että sinun on luotava if-lausekkeet jokaisen loukkaavan funktion ympärille (tai abstrahoitava funktiot erilliseen metodiin, joka käsittelee sopivan funktion kutsumisen OpenCV-versiosi perusteella).

Tehdäksesi tämän sinun on pystyttävä tarkistamaan OpenCV-versiosi käyttämästäsi Python-ohjelmasta käsin – ja tämän blogin loppupuolella näytetään sinulle, miten se tehdään!

Etsitkö tämän postauksen lähdekoodia?

Hyppää suoraan Lataukset-osioon

OpenCV:n versio sisältyy erityiseen cv2.__version__-muuttujaan, johon pääset käsiksi näin:

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

cv2.__version__-muuttuja on yksinkertaisesti merkkijono, jonka voit jakaa pää- ja sivuversioihin:

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

Tietysti tämän operaation suorittaminen joka kerta, kun sinun täytyy tarkastaa OpenCV:n versiosi, on hiukan tuskaa. Ratkaistakseni tämän ongelman olen lisännyt kolme uutta funktiota imutils-pakettiini, sarjaan mukavuusfunktioita, jotka helpottavat kuvankäsittelyn perustoimintoja OpenCV:llä ja Pythonilla.

Voit nähdä alla olevat is_cv2 , is_cv3 ja check_opencv_version -funktiot:

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)

Koodi tässä on melko suoraviivaista – tarkistan yksinkertaisesti, alkaako cv2.__version__-merkkijono kirjaimella 2 , mikä osoittaa, että käytämme OpenCV 2.X:ää, kirjaimella 3 , mikä osoittaa, että käytämme OpenCV 3:aa, tai kirjaimella 4 , mikä osoittaa, että käytämme OpenCV 4:ää.

Tämän lisäksi nämä toiminnot on jo sisällytetty imutils-pakettiin, jonka voit asentaa pipin avulla:

$ pip install imutils

Jos sinulla on jo imutils asennettuna, voit päivittää uusimpaan versioon käyttämällä:

$ pip install --upgrade imutils

Tarkista OpenCV-versiosi: A real-world example

Nyt kun tiedämme, miten voimme tarkistaa OpenCV-versiomme Pythonilla sekä määritellä pari mukavuusfunktiota version tarkistuksen helpottamiseksi, katsotaanpa, miten voimme käyttää näitä funktioita todellisessa esimerkissä.

Tavoitteenamme on havaita ääriviivat seuraavassa kuvassa:

Kuva 1: Hyödynnämme OpenCV 2.4.X:ää ja OpenCV 3:a havaitaksemme Tetris-lohkojen ääriviivat.
Kuva 1: Hyödynnämme OpenCV 2.4.X:ää ja OpenCV 3:a havaitaksemme Tetris-lohkojen ääriviivat (eli ääriviivat).

Kuvan ääriviivojen havaitsemiseen tarvitaan cv2.findContours-funktiota. Kuten tiedämme, cv2.findContours:n palautussignatuuri on kuitenkin muuttunut hieman OpenCV:n versioiden 3 ja 2.4 välillä (OpenCV 3:n versio cv2.findContours:stä palauttaa tuplissa ylimääräisen arvon) – meidän on siis tarkistettava OpenCV-versiomme ennen kutsua cv2.findContours:tä varmistaaksemme, että skriptimme ei erehdy. Katsotaanpa, miten voimme tehdä tämän tarkistuksen:

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

Kuten näet, meidän tarvitsee vain kutsua is_cv2 , is_cv4 ja is_cv3 ja sitten kietoa versiokohtainen koodimme if-lausekelohkojen sisään – siinä kaikki!

Nyt kun menen suorittamaan skriptini käyttäen OpenCV 2.4:ää, se toimii ongelmitta:

Kuva 2: Kutsumme cv2.findContours toimii OpenCV 2.4.X:ssä.
Kuva 2: Kutsumme cv2.findContours toimii OpenCV 2:ssa.4.X.

Ja sama pätee myös OpenCV 3:

Kuva 3: Ja sama pätee myös OpenCV 3:ssa, koska käytämme is_cv2- ja is_cv3-funktioita OpenCV-versioiden havaitsemiseen Pythonilla.
Kuvio 3: Ja sama pätee OpenCV 3:een, koska käytämme is_cv2- ja is_cv3-funktioita OpenCV-versioiden havaitsemiseen Pythonilla.

Yhteenveto

Tässä blogikirjoituksessa opimme, miten voimme tarkistaa OpenCV-versiomme Pythonilla. OpenCV-versio sisältyy erityiseen merkkijonomuuttujaan nimeltä cv2.__version__ . Meidän tarvitsee vain tarkistaa tämä muuttuja ja voimme määrittää OpenCV-versiomme.

Loppujen lopuksi olen määritellyt muutamia käteviä metodeja imutils-paketin sisällä, jotta OpenCV-version tarkistaminen olisi helpompaa ja pythonimaisempaa. Harkitse kirjaston tarkistamista, jos huomaat tarvitsevasi jatkuvasti tarkistaa OpenCV-versioita.

Vastaa

Sähköpostiosoitettasi ei julkaista.