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:
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:
Ja sama pätee myös OpenCV 3:
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.