Básico do OpenCV com Python – desenhar formas geométricas

Esse tutorial pode estar desatualizado. Encontre a versão revisada em meu blog dedicado ao tema clicando aqui.

As formas geométricas básicas que poderão ser desenhadas utilizando a OpenCV são a linha, o retângulo e o círculo. O princípio básico de aplicação é o mesmo, indicando a forma, a posição, a cor e a espessura do traço.

Nesse tutorial, além da OpenCV também é utilizada a biblioteca Numpy para a manipulação inicial da imagem. A biblioteca Numpy pode ser instalada com instruções a partir do website do projeto.

Criando o fundo da imagem

A aplicação das formas pode ser feita em uma imagem carregada ou capturada de um vídeo ou webcam, mas nesse tutorial criaremos uma imagem em branco e adicionaremos as formas nessa imagem. Criar a imagem em branco significará criar uma matriz colocando cada pixel da matriz com todas as cores. Para facilitar essa manipulação inicial de matriz, será utilizada a biblioteca Numpy, sendo necessário que ela esteja instalada junto ao Python.

Através da instrução da linha 4, é solicitado ao Numpy que crie uma matriz tridimensional, tendo 300 linhas, 400 colunas e a terceira dimensão para manter os 3 canais para as cores RGB. O método ones() da Numpy cria uma matriz toda preenchida com o número 1, sendo então necessário multiplicar os valores dessa matriz por 255 para obter a cor branca. A linha 5 mostra a imagem em uma janela e na linha 6 é esperado alguma tecla ser pressionada para os passos seguintes.

import cv2
import numpy as np   
    
canvas = np.ones((300, 400, 3)) * 255 #imagem 400x300, com fundo branco e 3 canais para as cores
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

 

Desenhando linhas

Uma linha é desenhada através do método line() da OpenCV (linha 9). Esse método espera como primeiro parâmetro em qual imagem será desenhada a linha. O segundo parâmetro é a coordenada onde a linha será iniciada, enquanto o terceiro parâmetro é a coordenada onde a linha finalizará. Será traçada uma linha reta entre a coordenada inicial e final. O quarto parâmetro é a especificação de uma cor para a linha. No código mostrado abaixo, a cor foi definida em uma variável para ser possivelmente reaproveitada (embora não tenha sido no código). Observe que as coordenadas e a cor são arrays.

As linhas 10 e 11 são responsáveis apenas por exibir a imagem na janela aberta anteriormente e esperar ser pressionada alguma tecla. Observe que a janela anterior e a solicitada na linha 10 possuem o mesmo nome e por isso a imagem será apenas atualizada na janela. Se nomes diferentes fossem utilizados, uma nova janela seria criada.

A primeira linha especificada corta a imagem na diagonal, saindo do canto superior esquerdo (coordenada 0, 0) e indo até o canto inferior direito (coordenada 300, 400 do plano cartesiano – coordenada 400, 300 da OpenCV).

Na linha 15 é criada uma outra linha, sendo essa uma linha que cortará a imagem ao meio e na horizontal. O método line() nessa instrução recebeu um parâmetro adicional que é o número de pixels para a espessura da linha. O padrão é fazer a forma com 1 pixel e sendo assim, a segunda linha será mais espessa do que a primeira. A segunda linha também recebeu a cor verde, definida através da linha 14.

#desenha a linha diagonal    
azul = (255, 0, 0)
cv2.line(canvas, (0, 0), (400, 300), azul)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

#desenha a linha vertical
verde = (0, 255, 0)
cv2.line(canvas, (200, 0), (200, 300), verde, 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

Desenhando retângulos

O método rectangle() da OpenCV é responsável por desenhar um retângulo e seus parâmetros são similares ao do método line(), sendo necessário informar a imagem que receberá a forma, as coordenadas inicial e final, uma cor e possibilidade de um valor para a espessura da linha (que será o contorno do retângulo). Um retângulo será formado entre as coordenadas inicial e final. A linha 19 é a instrução responsável por desenhar o retângulo verde visto na figura ao final do tutorial.

Observe que na linha 25 foi informado o valor -1 como valor da espessura da imagem. Esse valor negativo gerará um retângulo preenchido e não apenas contornado. A instrução dessa linha é a responsável por gerar o retângulo vermelho da figura.

#desenha o retângulo com borda verde    
cv2.rectangle(canvas, (10, 70), (90, 190), verde)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

#desenha o retângulo todo vermelho
vermelho = (0, 0, 255)
cv2.rectangle(canvas, (250, 50), (300, 125), vermelho, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

Desenhando círculos

Por fim é mostrado como desenhar um círculo na imagem. O método circle() é o método da OpenCV encarregado dessa tarefa. Esse método espera como primeiro parâmetro a imagem que receberá a forma e como segundo parâmetro uma coordenada, que será o centro do círculo. O terceiro parâmetro é o diâmetro que o círculo deverá ter. O quarto parâmetro a ser informado é a cor, podendo também receber um quinto parâmetro com a espessura da linha, ou o valor -1 para formar um círculo todo preenchido. A linha 30 do código é a responsável por desenhar o círculo visto na figura a seguir.

#desenha o círculo    
preto = (0, 0, 0)
cv2.circle(canvas, (130, 230), 50, preto)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

canvasFigura gerada

Veja que como foi utilizada a instrução cv2.waitKey() ao final de cada forma desenhada, a cada tecla pressionada será mostrado a adição de um novo elemento gráfico definido.

 

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.