A fost inevitabil – versiunea OpenCV 3 a fost obligată să întrerupă compatibilitatea cu unele funcții OpenCV 2.4.X: cv2.findContours
și cv2.normalize
îmi vin în minte din capul locului.
Atunci cum vă asigurați că codul dumneavoastră va funcționa indiferent de versiunea OpenCV pe care o folosește mediul de producție?
Bine, răspunsul scurt este că va trebui să creați declarații if
în jurul fiecăreia dintre funcțiile incriminate (sau să abstractizați funcțiile într-o metodă separată care să se ocupe de apelarea funcției corespunzătoare în funcție de versiunea OpenCV).
Pentru a face acest lucru, va trebui să puteți verifica versiunea OpenCV din interiorul aplicației Python pe care o utilizați – și asta este exact ceea ce restul acestui blog vă va arăta cum să faceți!
Căutați codul sursă al acestei postări?
Treceți direct la secțiunea de descărcări
Versiunea OpenCV este conținută într-o variabilă specială cv2.__version__
, pe care o puteți accesa astfel:
$ python>>> import cv2>>> cv2.__version__'3.0.0'
Variabila cv2.__version__
este pur și simplu un șir de caractere pe care îl puteți împărți în versiunea majoră și cea minoră:
>>> (major, minor, _) = cv2.__version__.split(".")>>> major'3'>>> minor'0'
Desigur, faptul că trebuie să efectuați această operațiune de fiecare dată când trebuie să verificați versiunea OpenCV este un pic de durere. Pentru a rezolva această problemă, am adăugat trei funcții noi la pachetul meu imutils, o serie de funcții de comoditate pentru a face mai ușoare funcțiile de bază de procesare a imaginilor cu OpenCV și Python.
Puteți vedea funcțiile mele is_cv2
, is_cv3
, și check_opencv_version
mai jos:
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)
Codul de aici este destul de simplu – verific pur și simplu dacă șirul cv2.__version__
începe cu un 2
, indicând că folosim OpenCV 2.X, un 3
, pentru a indica faptul că folosim OpenCV 3, sau un 4
, pentru a indica faptul că folosim OpenCV 4.
Încă o dată, aceste funcții au fost deja incluse în pachetul imutils, pe care îl puteți instala folosind pip:
$ pip install imutils
Dacă aveți deja instalat imutils
, puteți trece la cea mai recentă versiune folosind:
$ pip install --upgrade imutils
Verificarea versiunii OpenCV: un exemplu din lumea reală
Acum că știm cum să ne verificăm versiunea OpenCV folosind Python, precum și că am definit câteva funcții de confort pentru a face mai ușoară verificarea versiunii, să vedem cum putem folosi aceste funcții într-un exemplu din lumea reală.
Obiectivul nostru aici este de a detecta contururile în următoarea imagine:
Pentru a detecta contururile într-o imagine, va trebui să folosim funcția cv2.findContours
. Cu toate acestea, după cum știm, semnătura de returnare a funcției cv2.findContours
s-a schimbat ușor între versiunea 3 și 2.4 a OpenCV (versiunea OpenCV 3 a funcției cv2.findContours
returnează o valoare în plus în tuple) – astfel, va trebui să efectuăm o verificare a versiunii noastre OpenCV înainte de a efectua un apel la cv2.findContours
pentru a ne asigura că scriptul nostru nu dă eroare. Să aruncăm o privire la modul în care putem face această verificare:
# 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)
După cum puteți vedea, tot ce trebuie să facem este să efectuăm un apel la is_cv2
, is_cv4
și is_cv3
și apoi să înfășurăm codul nostru specific versiunii în interiorul blocurilor de declarații if
– asta e tot!
Acum, când mă duc să îmi execut scriptul folosind OpenCV 2.4, acesta funcționează fără probleme:
Și același lucru este valabil și pentru OpenCV 3:
Summary
În acest articol de blog am învățat cum să verificăm versiunea OpenCV folosind Python. Versiunea OpenCV este inclusă într-o variabilă specială de tip string numită cv2.__version__
. Tot ce trebuie să facem este să verificăm această variabilă și vom putea determina versiunea noastră OpenCV.
În cele din urmă, am definit câteva metode de conveniență în cadrul pachetului imutils pentru a face verificarea versiunii OpenCV mai ușoară și mai pythonică. Luați în considerare verificarea bibliotecii dacă vă aflați în situația în care aveți nevoie să verificați în mod constant versiunile OpenCV.
.