DEV Community

Maria Eduarda de Azevedo Silva for OpenDevUFCG

Posted on

Script para abrir webcam com Python utilizando OpenCV

Já pensou em desenvolver algum projetinho que precisa de uma captura de imagem em tempo real, mas não sabe por onde começar? Nesse post vamos trazer uma solução simples de como fazer um script utilizando Python3 e OpenCV para abrir a sua webcam!

Um pouco sobre a biblioteca OpenCV

A OpenCV é uma biblioteca de código aberto desenvolvida pela Intel nos anos 2000, inicialmente nas linguagens C e C++, com o objetivo de melhorar o aparato disponível para o desenvolvimento de aplicações, assim como nos estudos e pesquisas na área de Visão Computacional. Hoje em dia ela ainda é referência e se tornou multiplataforma e multilinguagem, isto é, podemos utilizá-la em aplicações nos mais diversos sistemas operacionais e linguagens de programação.

OpenCV + Python == "PERFEIÇÃO"

O OpenCV não foi apenas desenvolvido para melhorar a experiência em questão de otimização das técnicas e dos algoritmos de processamento de imagem, mas também para fácil utilização da biblioteca pelos interessados.
Quando unimos isso ao Python temos um ambiente perfeito para explorar a criatividade utilizando imagens: biblioteca simples e linguagem de sintaxe simples!
Quer provas? Continua lendo este post!

Instalando o OpenCV na sua máquina

Para iniciar, precisaremos instalar o OpenCV na nossa máquina. Para isso, você pode instalar o pacote via pip com o comando abaixo:



pip install opencv-python


Enter fullscreen mode Exit fullscreen mode

ou



pip3 install opencv-python


Enter fullscreen mode Exit fullscreen mode

Lembrando que é sempre bom considerar a criação de um ambiente virtual para seus projetos! Assim, caso você queira compartilhar e receber contribuições, irá ajudar bastante na configuração local do projeto na máquina do contribuidor, além de evitar que alguns erros se tornem incapazes de serem resolvidos. Caso não saiba como fazê-lo, consulte este link da documentação do Python para saber mais.

Mão na massa!

Com o OpenCV instalado na máquina podemos partir para o código! Crie um arquivo .py, abra o editor de sua preferência e vamos começar!

Antes de tudo, vamos importar a nossa biblioteca:



import cv2 as cv


Enter fullscreen mode Exit fullscreen mode

Com o pacote devidamente importado, poderemos partir para a captura da imagem pela webcam do seu computador!

Abrindo a webcam com código!

Abrir a webcam com um script Python é mais fácil do que você imagina! Vamos utilizar OpenCV para capturar imagens em tempo real.

Passo 1:

O primeiro passo é instanciar um objeto VideoCapture. Essa classe do OpenCV é responsável por realizar a captura de frames em um vídeo, o qual passamos o caminho como parâmetro na criação do objeto. No caso da leitura da webcam, precisamos passar o seu ID de referência (se você usa um laptop, o ID da sua câmera primária é 0):



camera = cv.VideoCapture(0)


Enter fullscreen mode Exit fullscreen mode

Passo 2:

Para iniciar o segundo passo, é importante que você entenda o que é um vídeo. De uma forma bem genérica, um vídeo é uma sucessão de imagens que imprimem uma sensação de movimento. A cada uma dessas imagens damos o nome de quadros (ou frames).

Fazendo o paralelo disso com lógica de programação, qual a estrututa que utilizamos para fazer uma repetição sucessiva de alguma coisa?

Se você respondeu laço, está mais que correto! Mas, qual laço escolher, for ou while?

Vamos pensar: estamos fazendo uma captura de vídeo em tempo real com a nossa webcam, então não sabemos quando a captura irá parar, desse modo enquanto estiver rodando nosso script eu capturo um frame novo. Matamos a charada e vamos de loop while!

Passando essa ideia para Python, temos algo do tipo:



rodando = True

while rodando:
    # Captura um frame
    pass


Enter fullscreen mode Exit fullscreen mode

Passo 3:

Agora podemos partir para todo o código dentro do loop!

Para fazer a captura do frame da vez, usaremos o método read() no nosso objeto VideoCapture. Esse método retorna uma tupla com dois valores: um booleano referente ao status de captura e o próprio frame no formato de um array NumPy.

O valor do status é muito útil para quando estamos lendo um vídeo passado por um caminho, visto que, quando chegamos no último frame do mesmo, o próximo não poderá ser capturado, o retorno desse valor será False e poderemos parar a execução do loop sem o lançamento de uma exceção. Além disso, pode haver algum problema na captura da webcam e isso ser indicado por esse retorno, por isso, vamos utilizá-lo.

Já o frame é essencial, já que é o que mais nos interessa! A imagem retornada será o alvo dos processamentos feitos durante a iteração do loop e também será jogada na saída.

Faremos isso da seguinte forma, dissociando os valores retornados em duas variáveis:



#...
while rodando:
    status, frame = camera.read()


Enter fullscreen mode Exit fullscreen mode

Passo 4:

Chegou o momento de falarmos das condições de parada.

Queremos parar a captura em dois casos:

  1. Em casos de erro
  2. Caso eu apenas queira parar de executar o script

Vamos unir essas duas condições de parada em apenas uma condição:



#...
    if not status or cv.waitKey(1) & 0xff == ord('q'):
        rodando = False


Enter fullscreen mode Exit fullscreen mode

Parece estranho, mas não é difícil de entender. O que estamos querendo dizer é basicamente "se deu algo errado na captura da imagem ou o usuário apertou a tecla 'q', então pare o script!".

A função cv.waitKey(1) espera que um evento de tecla acionada aconteça e, caso ocorra, ela retorna o valor da tecla pressionada segundo o padrão UTF-8. Para comparar se a tecla pressionada foi a 'q', combinamos o retorno dessa função com a constante hexadecimal 0xff e utilizamos a função padrão de python ord('q'), que retorna o valor de uma string passada como parâmetro em UTF-8.

Caso ao menos uma dessas condições seja satisfeita, a nossa variável rodando passa a receber False e na próxima iteração há a parada do loop.

Passo 5:

Nesse estágio já temos o objeto que captura nossa imagem da webcam, a imagem capturada devidamente lida e também uma condição de parada do nosso loop. Só nos resta uma coisa: jogar essa imagem na saída!

Para isso utilizaremos a função cv.imshow() do OpenCV. Essa função cria recebe dois parâmetros: uma string referente ao nome da janela e o array que se refere a imagem que queremos mostrar. Temos tudo que precisamos!

Para finalmente enxergarmos a captura em tempo real, escrevemos a seguinte linha dentro do loop:



#...
    cv.imshow("Camera", frame)


Enter fullscreen mode Exit fullscreen mode

Finalmente, o script!

Tudo isso resulta em um script de apenas 8 linhas!



import cv2 as cv 

camera = cv.VideoCapture(0)
rodando = True

while rodando:

    status, frame = camera.read()

    if not status or cv.waitKey(1) & 0xff == ord('q'):
        rodando = False

    cv.imshow("Camera", frame)


Enter fullscreen mode Exit fullscreen mode

Com isso temos tudo que você precisa para capturar imagens em tempo real utilizando um script simples em Python junto com OpenCV!

E o que fazer com esse script?

Existem várias possibilidades de aproveitar essa base, que vão desde detectores até registros de imagens para alguma aplicação ou sistema feito em Python.

Muito obrigada por ter lido até o fim! Se esse post te inspirou a criar alguma coisa, não se esquece de postar nas tuas redes e me marcar, que eu quero ver ~e quem sabe eu volte aqui com mais coisas legais para fazer com OpenCV~!

Minhas redes:
LinkedIn: Maria Eduarda de Azevedo Silva
Twitter: @ddt_azevedo
GitHub: MariaEduardaDeAzevedo

Top comments (2)

Collapse
 
juliobguedes profile image
Júlio Guedes

Já fazendo a conexão: esse post é uma ótima porta de entrada pra fazer coisas mais complicadas e legais. Ontem, na Python Nordeste, foram mostrados exemplos de detecção de rosto, nariz, pose, etc. E tudo isso usava como base o código daqui!

Collapse
 
veniciocosta profile image
veniciocosta

Quando modifico no código para uma webcam externa (camera = cv.VideoCapture(1)) o processo demora muuuito. Sabem o que posso fazer fazer para reduzir esse tempo?