Verificando sua versão do OpenCV usando Python

opencv_versions_header

Era inevitável – a versão do OpenCV 3 estava fadada a quebrar a compatibilidade com algumas funções do OpenCV 2.4.X: cv2.findContours e cv2.normalize vêm à minha cabeça.

Então como você garante que seu código funcionará, não importa qual versão do OpenCV o seu ambiente de produção está usando?

Bem, a resposta curta é que você precisará criar if declarações ao redor de cada uma das funções ofensivas (ou abstrair as funções para um método separado que trate de chamar a função apropriada baseada na sua versão do OpenCV).

Para fazer isso, você precisará ser capaz de verificar sua versão do OpenCV de dentro de você usando Python – e isso é exatamente o que o resto deste blog vai lhe mostrar como fazer!

Procurando o código fonte para este post?

Pule direto para a seção de downloads

A versão do OpenCV está contida dentro de uma variável especial cv2.__version__, que você pode acessar assim:

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

A variável cv2.__version__ é simplesmente uma string que você pode dividir em versões maiores e menores:

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

Obviamente, ter que realizar esta operação toda vez que você precisar verificar sua versão do OpenCV é um pouco doloroso. Para resolver este problema, eu adicionei três novas funções ao meu pacote imutils, uma série de funções de conveniência para facilitar as funções básicas de processamento de imagens com OpenCV e Python.

Você pode ver as minhas is_cv2 , is_cv3 , e check_opencv_version funções abaixo:

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)

O código aqui é bastante simples – estou simplesmente verificando se a string cv2.__version__ começa com um 2 , indicando que estamos usando OpenCV 2.X, um 3 , para indicar que estamos usando OpenCV 3, ou um 4 , para indicar que estamos usando OpenCV 4.

Again, estas funções já foram incluídas no pacote imutils, que você pode instalar usando pip:

$ pip install imutils

Se você já tem imutils instalado, você pode atualizar para a última versão usando:

$ pip install --upgrade imutils

Verificando sua versão do OpenCV: um exemplo do mundo real

Agora sabemos como verificar a nossa versão do OpenCV usando Python, assim como definimos algumas funções de conveniência para facilitar a verificação da versão, vamos ver como podemos usar essas funções em um exemplo do mundo real.

O nosso objectivo aqui é detectar contornos na seguinte imagem:

Figure 1: Vamos utilizar o OpenCV 2.4.X e OpenCV 3 para detectar os contornos dos blocos Tetris.
Figure 1: Vamos utilizar OpenCV 2.4.X e OpenCV 3 para detectar os contornos (ou seja, contornos) dos blocos Tetris.

Para detectar contornos em uma imagem, vamos precisar utilizar a função cv2.findContours. No entanto, como sabemos, a assinatura de retorno de cv2.findContours mudou ligeiramente entre a versão 3 e 2.4 do OpenCV (a versão OpenCV 3 de cv2.findContours retorna um valor extra no tuple) – assim precisaremos executar uma verificação na nossa versão do OpenCV antes de fazer uma chamada para cv2.findContours para garantir que o nosso script não erra. Vamos dar uma olhada em como podemos fazer essa verificação:

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

Como você pode ver, tudo o que precisamos fazer é fazer uma chamada para is_cv2 , is_cv4 , e is_cv3 e depois embrulhar nosso código específico da versão dentro dos blocos de comandos if – é isso!

Agora quando eu vou executar meu script usando OpenCV 2.4, ele funciona sem problema:

Figure 2: Nossa chamada para cv2.findContours está funcionando no OpenCV 2.4.X.
Figure 2: Nossa chamada para cv2.findContours está funcionando no OpenCV 2.4.X.

E o mesmo é válido para OpenCV 3:

Figure 3: E o mesmo é válido para OpenCV 3 já que estamos usando as funções is_cv2 e is_cv3 para detectar versões OpenCV com Python.
Figure 3: E o mesmo é verdade para o OpenCV 3 já que estamos usando as funções is_cv2 e is_cv3 para detectar versões do OpenCV com Python.

Sumário

Neste post do blog aprendemos como verificar nossa versão do OpenCV usando Python. A versão do OpenCV está incluída em uma variável de string especial chamada cv2.__version__ . Tudo o que precisamos fazer é verificar essa variável e poderemos determinar nossa versão do OpenCV.

Finalmente, eu defini alguns métodos de conveniência dentro do pacote imutils para tornar a verificação da sua versão do OpenCV mais fácil e mais Pythonic. Considere verificar a biblioteca se você achar que precisa verificar consistentemente as versões do OpenCV.

Deixe uma resposta

O seu endereço de email não será publicado.