Verificarea versiunii OpenCV folosind Python

opencv_versions_header

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:

Figura 1: Vom utiliza OpenCV 2.4.X și OpenCV 3 pentru a detecta contururile blocurilor Tetris.
Figura 1: Vom utiliza OpenCV 2.4.X și OpenCV 3 pentru a detecta contururile (adică contururile) blocurilor Tetris.

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:

Figura 2: Apelul nostru la cv2.findContours funcționează în OpenCV 2.4.X.
Figura 2: Apelul nostru la cv2.findContours funcționează în OpenCV 2.4.X.
Figura 2: Apelul nostru la cv2.findContours funcționează în OpenCV 2.4.X.
Figura 2: Apelul nostru la cv2.findContours funcționează în OpenCV 2.4.X.

Și același lucru este valabil și pentru OpenCV 3:

Figura 3: Și același lucru este valabil și pentru OpenCV 3, deoarece folosim funcțiile is_cv2 și is_cv3 pentru a detecta versiunile OpenCV cu Python.
Figura 3: Și același lucru este valabil pentru OpenCV 3, deoarece folosim funcțiile is_cv2 și is_cv3 pentru a detecta versiunile OpenCV cu Python.

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.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.