Lab07 - Traking de objetos e movimento
Objetivos da aula:
- Conhecer e praticar tracking de objetos em movimento
Background Subtraction¶
A intuição de como realizar essa tarefa nós já sabemso, basicamente iremos comparar duas imagem: a de referência do fundo com uma segunda imagem de teste. O resultado irá ressaltar a diferença da imagem.
####----- FAZENDO O DOWNLOAD DAS IMAGENS DO RESPOSITÓRIO, APENAS PARA FACILITAR -----#####
## SE ESTIVER RODANDO EM SUA MÁQUINA LOCAL NÃO PRECISA RODAR ESSA CELULA ##
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/pessoas-gif.gif /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/sala.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/sala1.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/sala2.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/sala3.jpg /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/sala_res.png /content
!wget https://raw.githubusercontent.com/arnaldojr/cognitivecomputing/master/material/aulas/lab07/Aula09/people-walking.mp4 /content
DESAFIO 1¶
Implemente um código (simples) que seja capaz de realizar a subtração das imagens e detectar movimento.
Dica: você pode usar operações cv2.absdiff(img1, img2)
e se necessário realizar uma operação morfologia (abertura/ fechamento, dilatação/erosão) para reduzir o ruido. O resultado deve ser parecido com a imagem "sala_res.png".
USE COMO IMAGENS DE ENTRADA AS OPÇÕES:¶
- SALA, SALA1, SALA2, SALA3
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('sala_res.png')
plt.figure(figsize = (10,10))
plt.imshow(img); plt.show();
# Implemente seu código.....
Background Subtraction em videos¶
O desafio acima foi fácil! pois existe uma imagem de fundo sozinha, como uma imagem da sala sem vazia. Basta subtrair a nova imagem do plano de fundo. Você obtém os objetos de primeiro plano sozinhos.
Mas, na maioria dos casos, você pode não ter essa imagem, então precisamos extrair o plano de fundo de qualquer imagem que tenhamos. Aiiiiii complica as coisas.
Na OpenCV podemos implementar isso por meio de dois algoritmos. O primeiro é createBackgroundSubtractorKNN() ou createBackgroundSubtractorMOG2(). Isso cria um objeto subtrator de fundo por K-Nearest Neighbor (KNN) ou Mixture of Gaussians (MOG2) . Então, podemos chamar a função apply()
com o objeto para obter a máscara do primeiro plano. Podemos exibir diretamente a máscara de primeiro plano em tempo real (com video :)).
Referência da documentação: https://docs.opencv.org/master/de/de1/group__video__motion.html#gac9be925771f805b6fdb614ec2292006d
Executar video no jupyter notebook normalmente da problema.¶
Existem algumas formas de rodar, mas pode ficar delay.
Sugestão: Escreva um script e execute direto pelo terminal.
###### leia com atenção!!! este código roda em sua máquina local.
import numpy as np
import cv2
#carrega o video
cap = cv2.VideoCapture('people-walking.mp4')
# Cria a subtração do fundo
#fgbg = cv2.createBackgroundSubtractorMOG2()
fgbg = cv2.createBackgroundSubtractorKNN()
while(1):
ret, frame = cap.read()
if not ret:
break
# Aplica a mascara no frame recebido
fgmask = fgbg.apply(frame)
cv2.imshow('fgmask',frame)
cv2.imshow('frame',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
DESAFIO 2¶
Crie um programa python e execute o código acima. O objetivo, nesse primeiro momento, é se familiarizar com a estrutura do código, para isso, explore os metodos MOG2
e KNN
e observe os resultados.
Explore os parametros da função:
history: O numero de frames usado para construir o modelo estatisco da fundo. Quando menor mais rapido.
dist2Threshold: é o limiar definido para saber se o pixel pertence ao fundo ou não da imagem. Quando menor mais sensivel.
detectShadows : Se True, a sombra (shadows) vai aparecer em cinza na imagem.
DESAFIO 3¶
Faça um programa que detecta o movimento das pessoas andando na rua e marca com um boundBox (retangulo) o que foi detectado.
Instruções/Dicas:
Use 'people-walking.mp4' como video para os testes.
Lembre-se do que já estudamos para remover ruido, realçar contorno, detectar bordas....
Sempre
Leia a documentação
: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.htmlUse a função cv2.boundingRect() para desenhar o retangulo.
O resultado dever ser semelhante ao do video.
from IPython.display import Image
Image(open('pessoas-gif.gif','rb').read())