Remoção de Background e Filtro de Canny com Python e OpenCV

Como citar esse artigo: VERTULO, Rodrigo. Remoção de Background e Filtro de Canny com Python e OpenCV. Disponível em: <http://iaacademy.com.br/2019/11/13/remocao-de-background-e-filtro-de-canny-com-python-e-opencv/>. Acessado em: 27/09/2020.


Este é um estudo utilizando a linguagem de programação Python com a biblioteca OpenCV cuja finalidade é conseguir identificar as bordas de moedas em tempo real a partir de imagens capturadas por uma webcam. Partirei do pressuposto de que você já possui tanto o Python 3.x quanto a biblioteca OpenCV instalados.

Serão utilizadas basicamente as tecnicas de remoção de background e aplicação do filtro de Canny para identificação das bordas das moedas.

Inicialmente será feita a importação das bibliotecas utilizadas pelo algoritmo.

In [1]:
import cv2
import time

O próximo passo consiste em inicializar/acessar a webcam conectada ao computador. Caso seu computador possua apenas uma webcam conectada ao mesmo, o parâmetro da função “VideoCapture” deverá ser “0”. Se você possuir mais de uma webcam o valor poderá ser “1”, “2”, etc. dependendo daquela que você deseja acessar. Logo após a chamada da função “VideoCapture” inseri um pequeno delay de dois segundos para dar tempo da webcam ser inicializada corretamente.

In [4]:
captura = cv2.VideoCapture(0)
time.sleep(2)

Para a tarefa de remoção do background, a primeira coisa que é preciso fazer é capturar um frame do vídeo apenas com o fundo, ou seja, sem nenhum objeto além do fundo presente na imagem. Para isso utilizarei a rotina “read”. Essa rotina retornará dois valores, mas para esse projeto interessará somente o segundo que é a imagem capturada.

In [5]:
_, imgFundo = captura.read()  # O _ é o primeiro parâmetro que não nos interessa

Com o primeiro frame do vídeo capturado, irei redimensionar o tamanho da imagem para que o processamento fique mais rápido.

In [6]:
imgFundo = cv2.resize(imgFundo, (640, 480))

Agora criarei uma cópia da imagem de fundo que é colorida convertendo-a para tons de cinza para otimizar ainda mais o processamento da imagem.

In [9]:
imgFundoGray = cv2.cvtColor(imgFundo, cv2.COLOR_RGB2GRAY)

Haverá um momento em que eu precisarei saber se uma determinada tecla foi pressionada e para isso utilizarei a variável chamada “binaria” que indicará quando a imagem a ser exibida será a colorida ou a imagem em preto e branco contendo apenas as bordas das moedas.

In [10]:
binaria = False  # Quando for False mostrará a imagem colorida, caso contrário a em preto e branco

Agora criarei um laço de repetição que ficará sendo executado constantemente e a cada iteração será capturado um novo frame pela webcam para que ele seja processado. O frame capturado será redimensionado para ficar do mesmo tamanho da imagem de fundo.

In [ ]:
while True:
    _, frame = captura.read()
    framew = cv2.resize(frame, (640, 480))

Agora é preciso verificar qual imagem será mostrada, ou seja, a imagem colorida ou a imagem em preto e branco contendo os contornos das moedas.

In [ ]:
    if binaria == True:  # Nesse caso mostrará a imagem em preto e branco.
        
        # Primeiro é necessário converter o frame para tons de cinza para ficar compatível
        # com o esquema de cor da imagem de fundo
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
        
        # Agora vou subtrair a imagem de fundo do frame
        imgSemFundo = cv2.subtract(imgFundoGray, frame)
        
        # Finalmente aplicarei o filtro de Canny para identificar as bordas das moedas
        imgComBordas = cv2.Canny(imgSemFundo, 50, 100)  # Os valores 50 e 100 foram definidos empiricamente
        
        # Tudo está pronto para exibir a imagem
        cv2.imshow("Imagem", imgComBordas)
        
    else:  # Nesse caso será exibida a imagem colorida
        
        cv2.imshow("Imagem", frame)

A última etapa do algoritmo consiste em identificar o pressionar de algumas teclas, sendo que ao pressionar a tecla “q” o programa é encerrado, com a tecla “b” é exibida a imagem em preto e branco com os contornos das moedas e com a tecla “c” é exibida a imagem colorida.

In [ ]:
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
    if cv2.waitKey(98) & 0xFF == ord("b"):
        binaria = True  # Exibindo a imagem em preto e branco
    if cv2.wautKey(99) & 0xFF == ord("c"):
        binaria = False  # Exibindo a imagem colorida
        
# Quando a tecla "q" é pressionada o laço while é interrompido e as
# instruções abaixo são executadas

capture.release()  # Liberando a webcam
cv2.destroyAllWindows()  # Encerrando a execução do OpenCV e do programa

Abaixo você pode ver o código completo desenvolvido.

In [ ]:
import cv2
import time


captura = cv2.VideoCapture(0)
time.sleep(2)

_, imgFundo = captura.read()
imgFundo = cv2.resize(imgFundo, (640, 480))
imgFundoGray = cv2.cvtColor(imgFundo, cv2.COLOR_RGB2GRAY)

binaria = False

while True:
    
    _, frame = captura.read()
    
    frame = cv2.resize(frame, (640, 480))
    
    
    if(binaria == True):
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
        imgSemFundo = cv2.subtract(imgFundoGray, frame)
        imgComBordas = cv2.Canny(imgSemFundo, 50, 100)
        
        cv2.imshow("Imagem", imgComBordas)
        
    else:
        cv2.imshow("Imagem", frame)
        
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
    if cv2.waitKey(98) & 0xFF == ord("b"):
        binaria = True
    if cv2.waitKey(99) & 0xFF == ord("c"):
        binaria = False        
        
captura.release()
cv2.destroyAllWindows()

O vídeo a seguir mostra o algoritmo em funcionamento.

 

Sê o primeiro

Deixe uma resposta

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