INTEGRANTES:
Igor Domingos da Silva Mozetic - 11202320802
Jhonattan Ferreira Machado - 11202320245
Mikael Alves Monteiro - 21055813
Data de Realização do relatório: 18/06/2025
Data de Publicação do relatório: 25/06/2025
INTRODUÇÃO
Este relatório tem por finalidade relatar, de forma abrangente, as atividades desenvolvidas no âmbito do Laboratório 1 da disciplina ESZA019 - 2025.2 - Visão Computacional. A prática realizada concentra-se no uso da biblioteca OpenCV, em conjunto com a linguagem Python, para explorar técnicas de captura, exibição e gravação de imagens e vídeos. Os exercícios experimentais propostos tiveram como propósito introduzir fundamentos essenciais do processamento digital de imagens e vídeos, ao mesmo tempo em que proporcionaram o aprimoramento de competências técnicas relacionadas a manipulação de arquivos e dispositivos de aquisição, como câmeras integradas ao sistema.
As atividades foram organizadas em duas partes. Na primeira, foram explorados programas fornecidos previamente, com o intuito de realizar leituras de imagens e vídeos, ajustar velocidades de exibição, capturar imagens mediante interações com o teclado e salvar os arquivos resultantes. Modificações nos códigos foram realizadas para atender aos objetivos específicos de cada exercício. Na segunda parte, foram obtidas imagens e vídeos por meio da webcam, seguindo instruções específicas de composição e movimentação, com o intuito de gerar material que será utilizado em atividades futuras da disciplina.
Este relatório apresenta uma descrição detalhada dos procedimentos adotados, os resultados obtidos, as alterações implementadas nos programas, bem como análises e discussões pertinentes. O conteúdo foi estruturado com caráter didático, de modo a permitir que outros estudantes consigam reproduzir os experimentos de forma autônoma.
Para acessar o arquivo PDF com as instruções que foi utilizado para realização da prática, clique no Link.PROCEDIMENTOS EXPERIMENTAIS
Para a realização da prática, foi solicitado para que fosse realizado o download de uma pasta compactada, localizada na aba "Semana 3 - (16 e 18/6/2025)" dentro da pasta "Lab1 - CAPtura de imagem e de Video" no Moodle.
Dentro dessa pasta compactada, haviam 6 itens, sendo eles quatro arquivos em python, uma imagem e um vídeo:
- L1_1_img.py
- L1_2_video.py
- L1_3_webcam.py
- L1_4_webcap.py
- messi5.jpg
- big_buck_bunny.mp4 Para baixar a pasta compactada, clique aqui
Após a realização do download, foi solicitado a iniciação do ambiente virtual para que a prática pudesse começar a ser realizada.
PARTE 1: Processamento Básico nas Imagens e Vídeos.
A) Leitura de imagem em arquivo: O programa “L1_1_img.py” realiza a leitura e de imagem gravado num arquivo e mostra a imagem numa janela do linux. Além disso, o programa permite salvar aimagem em arquivo. Execute e verifique o resultado:
Python3 L1_1_img.py
Nessa alternativa do relatório, foi solicitado para executar o comando acima no terminal e analisar como a figura seria exibida em uma nova janela. Ao executar o comando, foi obtido o seguinte resultado:

L1_1_img.py
Analisando o resultado obtido, é perceptível que a imagem está em tom de cinza. Para entender o motivo desse acontecimento é necessário analisar o código do arquivo. Segue o código:
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # wait for ESC key to exit
cv.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()
L1_1_img.py
No código, as duas primeiras linhas estão sendo importadas as bibliotecas que serão utilizadas no restante do código.
Na 3º linha img = cv.imread('messi5.jpg',0)
, o código está carregando a imagem chamada
"messi5.jpg" em modo grayscale (tons de cinza), pois o segundo parâmetro é 0. A
imagem é armazenada na variável img
.
Na 4º linha cv.imshow('image',img)
, o código está exibindo a imagem carregada em uma janela
com o nome "image". Essa janela mostra o conteúdo da variável img
.
Na 5ª linha k = cv.waitKey(0)
, o programa fica aguardando indefinidamente até que o usuário
pressione alguma tecla. A tecla pressionada é armazenada na variável k
.
Na 6ª linha if k == 27:
, o código verifica se a tecla pressionada foi a tecla ESC
(representada pelo código 27). Se for, ele fecha todas as janelas abertas com
cv.destroyAllWindows()
.
Na 8ª linha elif k == ord('s'):
, o código verifica se a tecla pressionada foi a tecla
's'. Se for, ele salva a imagem carregada com o nome "messigray.png" e
também fecha todas as janelas.
B) Leitura de vídeo em arquivo: O programa “L1_2_video.py” realiza a leitura de video gravado num arquivo e exibe a sequencia das imagems numa janela do linux. Execute e verifique o resultado:
Python3 L1_2_video.py
Nessa alternativa do relatório, foi solicitado para executar o comando acima no terminal e analisar como o vídeo seria exibido através de uma sequência de imagens em uma nova janela. Ao executar o comando, foi obtido o seguinte resultado:

L1_2_video.py
O vídeo em questão é:
L1_2_video.py
Para entender o motivo desse acontecimento é necessário analisar o código do arquivo. Segue o código:
import time
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('big_buck_bunny.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
# show the frame
cv.imshow('frame',frame)
#wait next frame by 40ms - 25fps
time.sleep(1/25.0)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()
L1_2_video.py
No código, as três primeiras linhas estão importando as bibliotecas necessárias para a execução:
time
para controle de tempo, numpy
para manipulação de arrays e cv2
para processamento de vídeo e imagem com OpenCV.
Na 4ª linha cap = cv.VideoCapture('big_buck_bunny.mp4')
, o código está carregando o vídeo
chamado "big_buck_bunny.mp4" para reprodução. A função VideoCapture
cria um
objeto que será usado para capturar quadro a quadro do vídeo.
Na 6ª linha while(cap.isOpened()):
, o código inicia um loop que continuará enquanto o vídeo
estiver aberto corretamente e houver quadros para ler.
Na 7ª linha ret, frame = cap.read()
, o código tenta ler o próximo quadro do vídeo.
ret
será True
se o quadro for lido com sucesso, e frame
contém a
imagem do quadro atual.
Na 9ª linha if ret==True:
, o código verifica se o quadro foi lido com sucesso. Se sim, o bloco
de instruções dentro do if
será executado.
Na 11ª linha cv.imshow('frame',frame)
, o código exibe o quadro atual em uma janela chamada
"frame".
Na 13ª linha time.sleep(1/25.0)
, o código pausa por 1/25 segundos (ou 40 milissegundos), para
simular uma taxa de atualização de 25 quadros por segundo (fps), que é comum em vídeos.
Na 15ª linha if cv.waitKey(1) & 0xFF == ord('q'):
, o código verifica se a tecla
'q' foi pressionada. Se sim, o loop será interrompido, encerrando a reprodução do vídeo.
Na 17ª linha else:
, caso ret
seja False
(por exemplo, se o vídeo
chegou ao fim), o loop também é encerrado.
Na 20ª linha cap.release()
, o código libera o objeto de captura de vídeo, liberando os
recursos associados.
Na 21ª linha cv.destroyAllWindows()
, o código fecha todas as janelas abertas do OpenCV.
C) Leitura de imagem de câmera: O programa “L1_3_webcam.py” realiza a leitura de imagens da camera instalada no computador e exibe a sequencia das imagems amostradas numa janela do linux. Execute e verifique o resultado:
Python3 L1_3_webcam.py
Nessa alternativa do relatório, foi solicitado para executar o comando acima no terminal e analisar a sequência das imagens da câmera instalada no computador exibidas em uma nova janela. Ao executar o comando, foi obtido o seguinte resultado:

L1_3_webcam.py
Para entender o motivo desse acontecimento é necessário analisar o código do arquivo. Segue o código:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Display the resulting frame
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
L1_3_webcam.py
No código, as duas primeiras linhas estão importando as bibliotecas necessárias: numpy
para
manipulação de arrays e cv2
para captura e exibição de vídeo com OpenCV.
Na 3ª linha cap = cv.VideoCapture(0)
, o código está iniciando a captura de vídeo da câmera
padrão do computador (geralmente a webcam). O número 0
indica que será usada a primeira câmera
conectada.
Na 5ª linha if not cap.isOpened():
, o código verifica se a câmera foi aberta corretamente. Se
não for possível abrir a câmera, será exibida a mensagem "Cannot open camera" e o programa
será encerrado com exit()
.
Na 8ª linha while True:
, é iniciado um loop infinito para capturar e exibir os quadros da
câmera em tempo real.
Na 10ª linha ret, frame = cap.read()
, o código captura o próximo quadro da câmera.
ret
indica se a captura foi bem-sucedida, e frame
armazena a imagem capturada.
Na 12ª linha if not ret:
, o código verifica se ocorreu algum erro ao capturar o quadro. Caso
não tenha sido possível ler o quadro corretamente, uma mensagem de erro será exibida e o loop será
encerrado.
Na 16ª linha cv.imshow('frame', frame)
, o código exibe o quadro capturado em uma janela
chamada "frame", mostrando o vídeo em tempo real.
Na 18ª linha if cv.waitKey(1) == ord('q'):
, o código verifica se a tecla 'q'
foi pressionada. Se sim, o loop é encerrado e o programa segue para liberar os recursos.
Na 21ª linha cap.release()
, o código libera a câmera, encerrando a captura de vídeo.
Na 22ª linha cv.destroyAllWindows()
, o código fecha todas as janelas abertas pelo OpenCV.
D) Gravação de vídeo da câmera: O programa “L1_4_webcap.py” realiza a leitura de imagens da câmera, exibr a sequência de imagens numa nova janela do Linux, e ao digitar a tecla “q” salva toda a sequência de imagens num arquivo “saida.avi” no formato AVI de vídeo. Execute e verifique o resultado:
Python3 L1_4_webcap.py
Nessa alternativa do relatório, foi solicitado para executar o comando acima no terminal e analisar a sequência das imagens da câmera instalada no computador exibidas em uma nova janela. Além disso, ao selecionar o tecla "q", salvar toda a sequência de imagens em um arquivo "saida.avi". Ao executar o comando, foi obtido o seguinte resultado:

L1_4_webcap.py
O vídeo gerado após clicar na tecla "q" é:
L1_4_webcap.py
Para entender o motivo desse acontecimento é necessário analisar o código do arquivo. Segue o código:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Get current width of frame
width = cap.get(cv.CAP_PROP_FRAME_WIDTH) # float
# Get current height of frame
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT) # float
# Define Video Frame Rate in fps
fps = 30.0
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('saida.avi', fourcc, fps, (int(width),int(height)) )
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
L1_4_webcap.py
No código, as duas primeiras linhas estão importando as bibliotecas necessárias: numpy
para
manipulação de arrays e cv2
para captura e manipulação de vídeos com OpenCV.
Na 3ª linha cap = cv.VideoCapture(0)
, o código inicia a captura de vídeo da câmera padrão do
computador (geralmente a webcam). O número 0
indica que será usada a primeira câmera
disponível.
Nas linhas 5 e 7, o código obtém as dimensões atuais do vídeo capturado.
width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
retorna a largura dos quadros e
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
retorna a altura. Ambos os valores são inicialmente
float
.
Na linha 9, fps = 30.0
define que o vídeo será gravado a 30 quadros por segundo (frames por
segundo).
Na linha 12, fourcc = cv.VideoWriter_fourcc(*'XVID')
define o codec de compressão de vídeo que
será utilizado para salvar o arquivo. O codec 'XVID' é amplamente usado para arquivos AVI.
Na linha 13, out = cv.VideoWriter('saida.avi', fourcc, fps, (int(width),int(height)))
cria um
objeto VideoWriter
que será responsável por salvar o vídeo com o nome
'saida.avi', usando o codec definido, com a taxa de quadros especificada, e nas dimensões
capturadas da câmera.
Na linha 15, o while cap.isOpened():
inicia um loop que continuará enquanto a câmera estiver
funcionando corretamente.
Na linha 16, ret, frame = cap.read()
captura um novo quadro da câmera. ret
indica
se a captura foi bem-sucedida, e frame
contém o quadro capturado.
Na linha 17, if not ret:
verifica se houve falha na captura do quadro. Se sim, é exibida uma
mensagem de erro e o loop é encerrado.
Na linha 19, frame = cv.flip(frame, 0)
inverte verticalmente o quadro capturado (flip no eixo
0).
Na linha 21, out.write(frame)
salva o quadro invertido no arquivo de vídeo definido
anteriormente.
Na linha 22, cv.imshow('frame', frame)
exibe o quadro atual (invertido) em uma janela chamada
"frame".
Na linha 23, if cv.waitKey(1) == ord('q'):
verifica se a tecla 'q' foi
pressionada. Se for, o loop é encerrado.
Na linha 26, cap.release()
libera a câmera, encerrando a captura de vídeo.
Na linha 27, out.release()
finaliza o arquivo de vídeo e libera o objeto responsável por
gravá-lo.
Na linha 28, cv.destroyAllWindows()
fecha todas as janelas abertas pelo OpenCV.
PARTE 2: Obtenção de Fotos e Vídeos
A) Obter com a webcam uma foto geral com TODOS os integrantes da EQUIPE, sendo que cada um deve usar uma roupa de cor diferente, melhor se for com as cores Vermelho, Verde e Azul destacadas. Cuidem para a iluminação ficar boa. Podem usar qualquer editor de imagem caso necessitem “Compor” as fotos individuais para formar a foto geral.
Começando a PARTE 02, nessa alternativa do relatório, foi solicitado para que fosse tirada uma foto com todos os integrantes do grupo com cores de camisa diferentes utilizando os códigos da PARTE 01. Segue a foto:

Após modificar o código original da PARTE 01 para que atendesse as expectativas na PARTE 02, segue o código:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Display the resulting frame
cv.imshow('frame', frame)
k = cv.waitKey(0)
if k == ord('q'):
break
elif k == ord('s'): # wait for 's' key to save
cv.imwrite('captura.png',frame)
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
L1_3_webcam.py
O código acima é quase idêntico ao código do item ( C ) da PARTE 01 do experimento, as únicas alterações estão nas linhas:
Na linha 19 k = cv.waitKey(0)
, o código utiliza cv.waitKey(0)
,
que faz com que o programa pause indefinidamente após exibir cada quadro, aguardando que o usuário
pressione uma tecla para continuar.
Na linha 20 if k == ord('q'):
, o código verifica se a tecla pressionada foi
'q'; se sim, o loop é encerrado, finalizando a execução.
Na linha 22 cv.imwrite('captura.png', frame)
, o código salva o quadro atual da câmera
(armazenado na variável frame
) como uma imagem com o nome 'captura.png'.
B) Façam uma foto-montagem “Avatar”, juntando todos avatares numa única imagem. Podem usar qualquer editor de imagem para “Compor” as fotos individuais que cada um da equipe vai fornecer.
Nessa alternativa do relatório, foi solicitado para que fosse realizada uma imagem dos avatares de todos os integrantes do grupo juntos. Para realização foi utilizado o aplicativo Paint. Segue a imagem montada:

C) Filmem com a webcam DOIS vídeos com pessoas e DOIS videos com um objeto:
- um com mudanças lentas de movimento
- e outro com mudanças rápidas de movimento.
- Em cada um dos vídeos os membros da equipe DEVEM ser diferentes. Podem ser apenas dois membros, um em cada vídeo, e sugiro escolherem os que possuem as melhores câmeras.
Nessa alternativa do relatório, foi solicitado para que fosse realizado a gravação de 4 vídeos, sendo eles:
- Vídeo com mudanças lentas de movimento
- Vídeo com mudanças rápidas de movimento
- Vídeo com mudanças lentas de movimento segurando um objeto
- Vídeo com mudanças rápidas de movimento segurando um objeto
Após modificar o código original da PARTE 01 para que atendesse as expectativas na PARTE 02, segue o código:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Get current width of frame
width = cap.get(cv.CAP_PROP_FRAME_WIDTH) # float
# Get current height of frame
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT) # float
# Define Video Frame Rate in fps
fps = 30.0
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('saida.avi', fourcc, fps, (int(width),int(height)) )
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
L1_4_webcap.py
O código acima é quase idêntico ao código do item ( D ) da PARTE 01 do experimento, as únicas alterações estão nas linhas:
Na linha 18, foi retirado o código frame = cv.flip(frame, 0)
, pois ele inverte verticalmente o
quadro capturado da câmera.
ANÁLISE E DISCUSSÃO DOS ESTUDADOS REALIZADOS
PARTE 1: Processamento Básico nas Imagens e Vídeos.
A) Leitura de imagem em arquivo: O programa “L1_1_img.py” realiza a leitura e de imagem gravado num arquivo e mostra a imagem numa janela do linux. Além disso, o programa permite salvar aimagem em arquivo. Execute e verifique o resultado:
Python3 L1_1_img.py
Responda: por que a janela aberta não mostra a imagem colorida?
No código apresentado, a imagem 'messi5.jpg' não é exibida em cores porque está
sendo
carregada em escala de cinza (grayscale) devido ao segundo argumento da função
cv.imread()
.
Na linha img = cv.imread('messi5.jpg', 0)
, o número 0 passado como segundo
parâmetro indica ao OpenCV que a imagem deve ser carregada no modo grayscale. Isso
significa que a imagem será convertida automaticamente para tons de cinza, perdendo as informações de cor
originais (RGB).
Segundo a documentação oficial do OpenCV, os valores possíveis para o segundo parâmetro de
cv.imread()
são:
- cv.IMREAD_COLOR (ou 1): Carrega a imagem em cores (modo padrão).
- cv.IMREAD_GRAYSCALE (ou 0): Carrega a imagem em tons de cinza.
- cv.IMREAD_UNCHANGED (-1): Carrega a imagem com o canal alfa, se houver (incluindo transparência).
- Link para a função ImreadModes.
- Link para a Tabela com a enumeração.
Portanto, para exibir a imagem em cores, o segundo argumento da função cv.imread()
deve ser
alterado para 1
ou simplesmente omitido (pois cv.IMREAD_COLOR
é o comportamento
padrão).
Logo, o código ficaria dessa maneira:
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # wait for ESC key to exit
cv.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()
L1_1_img.py
B) Leitura de vídeo em arquivo: O programa “L1_2_video.py” realiza a leitura de video gravado num arquivo e exibe a sequencia das imagems numa janela do linux. Execute e verifique o resultado:
Python3 L1_2_video.py
Altere: modifique o programa para que as imagens sejam exibidas mais rápidamente e depois para que sejam exibidas mais lentamente.
Responda: qual a explicação de alteração de velocidade de exibição, e apresente suas soluções detalhadamente.
O programa apresentado lê um vídeo e exibe seus quadros um a um usando o OpenCV, controlando a velocidade
de exibição pela função time.sleep()
, que pausa o programa por um intervalo de tempo entre os
quadros.
Atualmente, a linha time.sleep(1/25.0)
faz o programa aguardar 1/25 segundos (40
milissegundos) antes de exibir o próximo quadro, o que corresponde a uma taxa de 25 quadros por
segundo (fps). Essa pausa é responsável por sincronizar a exibição dos quadros para que o vídeo
seja mostrado em velocidade natural.
Para exibir os quadros mais rapidamente:
- Reduza o tempo de pausa na função
time.sleep()
para um valor menor que 1/25 (menos de 40 ms). - Exemplo: para aproximadamente 100 fps, utilize
time.sleep(1/100.0)
, ou seja, 10 ms de pausa.
Exemplo de código modificado para mais rápido (100 fps):
import time
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('big_buck_bunny.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
# show the frame
cv.imshow('frame',frame)
#wait next frame by 10ms - 100fps
time.sleep(1/100.0)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()
L1_2_video.py
O método time.sleep()
pausa a execução do programa pelo número de segundos especificado. Ao
diminuir o tempo de pausa, os quadros são exibidos com maior frequência, resultando em uma reprodução mais
rápida do vídeo. Por outro lado, aumentar o tempo de pausa faz com que cada quadro permaneça na tela por
mais tempo, diminuindo a velocidade de reprodução.
Além disso, é importante que o valor passado para time.sleep()
esteja alinhado à taxa de
quadros natural do vídeo para evitar reprodução acelerada ou muito lenta que possa prejudicar a experiência
visual.
C) Leitura de imagem de câmera: O programa “L1_3_webcam.py” realiza a leitura de imagens da camera instalada no computador e exibe a sequencia das imagems amostradas numa janela do linux. Execute e verifique o resultado:
Python3 L1_3_webcam.py
Altere: modifique o programa para que uma imagem da câmera seja salva num arquivo “foto1.png” no momento em que for clicada a tecla ‘x’ no teclado. Apresente o resultado e sua solução detalhadamente.
O código original realiza a captura de vídeo da câmera e exibe os quadros em tempo real. A modificação solicitada consiste em adicionar uma funcionalidade que permita salvar o quadro atual em um arquivo chamado "foto1.png" ao pressionar a tecla 'x'.
Para isso, adicionamos uma verificação dentro do loop para detectar se a tecla 'x' foi
pressionada.
Se for, utilizamos a função cv.imwrite()
para salvar o conteúdo atual da variável
frame
(que representa o quadro capturado da câmera) no arquivo desejado.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Display the resulting frame
cv.imshow('frame', frame)
key = cv.waitKey(1)
if key == ord('q'):
break
elif key == ord('x'):
cv.imwrite('foto1.png', frame)
print("Foto salva como 'foto1.png'")
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
L1_3_webcam.py
O que foi alterado no código:
key = cv.waitKey(1)
: armazena a tecla pressionada pelo usuário.elif key == ord('x')
: verifica se a tecla pressionada foi a letra 'x'.cv.imwrite('foto1.png', frame)
: salva o quadro atual da câmera em um arquivo de imagem com o nome foto1.png.print("Foto salva como 'foto1.png'")
: fornece uma confirmação no console para o usuário.
Ao executar o programa, a janela mostrará a imagem da câmera em tempo real. Quando o usuário pressionar a tecla 'x', o quadro atual será salvo como foto1.png no mesmo diretório onde o script está sendo executado. A tecla 'q' ainda funciona como comando para encerrar a aplicação.
D) Gravação de vídeo da câmera: O programa “L1_4_webcap.py” realiza a leitura de imagens da câmera, exibr a sequência de imagens numa nova janela do Linux, e ao digitar a tecla “q” salva toda a sequência de imagens num arquivo “saida.avi” no formato AVI de vídeo. Execute e verifique o resultado:
Python3 L1_4_webcap.py
Altere: modifique o programa para que as imagens gravadas estejam “normais” no arquivo de video salvo, e apresentem uma velocidade de exibição adequada. Apresente o resultado e sua solução detalhadamente.
O código está fazendo com que o vídeo salvo está sendo gravado de cabeça para baixo por
causa da função cv.flip(frame, 0)
, e pode apresentar velocidade incorreta se o valor de
fps
não estiver bem ajustado ao hardware da câmera.
O fato da imagem estar "de cabeça para baixo" é causado pela linha
frame = cv.flip(frame, 0)
invertendo o quadro capturado verticalmente (eixo 0). Para
manter o vídeo salvo em sua orientação normal, basta remover ou comentar essa linha.
A taxa de quadros por segundo (fps
) usada na criação do VideoWriter
deve refletir
a taxa real de captura da câmera para evitar que o vídeo seja reproduzido muito rápido ou muito devagar.
Para um bom resultado, mantenha fps = 30.0
se sua câmera suporta 30 fps. Você também pode
consultar a taxa real com cap.get(cv.CAP_PROP_FPS)
.
Aplicando as correções necessárias no código, obtemos:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Get current width and height of frame
width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
fps = 30.0 # Ajuste conforme necessário
# Define codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('saida.avi', fourcc, fps, (int(width), int(height)))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# write the normal (não invertido) frame
out.write(frame)
# Show frame in real time
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv.destroyAllWindows()
L1_4_webcap.py
A partir das correções, temos os seguintes resultados:
- O vídeo exibido na janela continua aparecendo normalmente em tempo real.
- O arquivo
saida.avi
será salvo com os quadros sem inversão. - A reprodução do vídeo ocorrerá com uma velocidade natural, condizente com os 30 fps definidos.
CONCLUSÕES
Neste primeiro experimento prático da disciplina de Visão Computacional, foi possível adquirir conhecimentos
fundamentais sobre o uso da biblioteca OpenCV em conjunto com a linguagem Python para manipulação de imagens e
vídeos. As atividades realizadas proporcionaram uma introdução à captura de imagens por meio de dispositivos de
entrada (como webcams), à exibição em tempo real dessas imagens em janelas gráficas e à sua gravação em arquivos
de vídeo.
Durante o desenvolvimento, algumas funções da OpenCV se destacaram pela sua utilidade e aplicabilidade prática.
A função cv2.VideoCapture()
foi fundamental para acessar o dispositivo de captura de vídeo,
enquanto cv2.imshow()
permitiu a visualização em tempo real dos frames capturados. A função
cv2.VideoWriter()
possibilitou a gravação dos vídeos gerados, e cv2.waitKey()
foi
essencial para controlar o fluxo do programa, aguardando comandos do teclado. Por fim,
cv2.destroyAllWindows()
garantiu o encerramento adequado das janelas abertas, contribuindo para uma
finalização segura da aplicação.
Além disso, o exercício permitiu compreender melhor o funcionamento de estruturas básicas de controle
de fluxo em aplicações de visão computacional, como o uso de laços de repetição para leitura contínua de frames
e a aplicação de comandos para encerramento seguro do programa. Dessa forma, o laboratório cumpriu seu papel
introdutório, preparando o terreno para o aprofundamento em técnicas mais avançadas de processamento e análise
de imagens nas próximas atividades da disciplina.
REFERÊNCIAS
- LEARN OPENCV. Read, Write and Display a Video using OpenCV (C++/Python). Disponível em: https://learnopencv.com/read-write-and-display-a-video-using-opencv-cpp-python/ . Acesso em: 25 jun. 2025.
- OPENCV. ImreadModes — Flags for imread. Disponível em: https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80 . Acesso em: 25 jun. 2025.
- OPENCV. Image Codecs Flags – Enum members. Disponível em: https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__flags.html#enum-members . Acesso em: 25 jun. 2025.
- OPENCV. cv.waitKey — HighGUI module reference. Disponível em: https://docs.opencv.org/4.x/d7/dfc/group__highgui.html#ga5870d8a0eacb8fbd30b5b3eab805f658 . Acesso em: 25 jun. 2025.
- OPENCV. cv.imwrite — Image Codecs Save Functions. Disponível em: https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__save.html#ga61f7f9b02c5d92b7370d87725a28eab0 . Acesso em: 25 jun. 2025.
- OPENCV. Tutorial: Display video (Python). Disponível em: https://docs.opencv.org/4.x/dd/d43/tutorial_py_video_display.html . Acesso em: 25 jun. 2025.
- OPENCV. VideoCapture Class Reference. Disponível em: https://docs.opencv.org/4.x/dd/d9e/classcv_1_1VideoCapture.html . Acesso em: 25 jun. 2025.
- OPENCV. VideoWriter Class Reference. Disponível em: https://docs.opencv.org/4.x/dd/d9e/classcv_1_1VideoWriter.html . Acesso em: 25 jun. 2025.
- PYTHON SOFTWARE FOUNDATION. time.sleep — Python 3 documentation. Disponível em: https://docs.python.org/3/library/time.html#time.sleep . Acesso em: 25 jun. 2025.