A visão computacional trata da aquisição, análise, interpretação e síntese de dados visuais por meio do uso de recursos computacionais. Ela possui várias aplicações como a detecção e reconhecimento facial e a detecção de objetos.
A detecção de veículos em tempo real é uma das muitas aplicações da detecção de objetos. Seu objetivo é realizar a detecção de veículos em uma imagem ou vídeo juntamente com as coordenadas de suas localizações.
Nesse post, utilizaremos a biblioteca OpenCV e um classificador Haar cascade pré-treinado para realizar a detecção de veículos com Python em vídeos.
Pré-requisitos
É necessário instalar a biblioteca OpenCV caso você ainda não a tenha instalada. Para a instalação com pip:
pip install opencv-python
Para a instalação através do conda:
conda install -c conda-forge opencv
Também é necessário baixar o classificador pré-treinado que será usado. Ele é o Haar cascade para carros e pode ser achado em alguns repositórios do GitHub como esse.
Precisaremos também de um vídeo com carros em movimento para testar o código que será desenvolvido. Para esse post, utilizaremos esse exemplo do pexels. A resolução que escolhemos para download foi Full HD 1920×1080.
Detecção de veículos com Python
Crie um arquivo do Python chamado classificador_veiculos.py. Nesse arquivo, importe a biblioteca OpenCV e carregue o classificador que será utilizado. Ele precisa estar na mesma pasta que o código ou será preciso indicar sua localização.
import cv2
classifier = cv2.CascadeClassifier('haarcascade_car.xml')
Em seguida, definimos uma função chamada detecta_carros que detecta veículos e desenha um retângulo ao redor deles. Seu código é mostrado abaixo. Ela tem como argumento um frame do vídeo e retorna um frame com os veículos detectados marcados com um retângulo.
Os comandos usados nessa função são equivalentes aos utilizados aqui para detecção de faces. Dentro da função, usamos o método detectMultiScale para realizar a detecção de veículos. Esse método tem alguns parâmetros que precisam ser compreendidos.
Seu primeiro parâmetro é um frame de vídeo em escala de cinzas.
O parâmetro scaleFactor reduz o tamanho da imagem de entrada para tornar mais fácil para o algoritmo detectar objetos grandes. Especificamos um fator de 1.1, indicando que queremos reduzir o tamanho da imagem em 10%.
Nosso classificador cascade funciona com uma sliding window que corre através da imagem para detectar veículos nela. O parâmetro minNeighbors define em quantas sliding windows vizinhas um veículo precisa ser detectado para sua detecção ser considerada válida. No nosso caso, o valor escolhido foi 5.
O parâmetro minSize determina um valor mínimo que um objeto precisa ter para ser detectado.
É importante enfatizar: todos os parâmetros dessa função influenciam os resultados do classificador e devem ser ajustados de acordo com suas necessidades.
Após definirmos o classificador na função, é necessário usar as coordenadas que ele retorna para traçar um retângulo ao redor dos veículos. Isso é feito nas linhas 7-8 do código abaixo.
def detecta_carros(frame):
carros = classifier.detectMultiScale(frame,
scaleFactor=1.1,
minNeighbors=5,
minSize=(60, 60))
for (x, y, w, h) in carros:
cv2.rectangle(frame, (x, y), (x+w,y+h), color=(0, 255, 0), thickness=2)
return frame
Detecção de veículos com Python em vídeos
Na sequência, definimos uma segunda função chamada Simulator que aplica a função detecta_carros sobre os frames de um vídeo. Ela tem como argumento um vídeo. Esse vídeo pode ser fornecido por uma câmera diretamente conectada ao computador.
A função Simulator usa alguns métodos da biblioteca OpenCV. Primeiro, ela cria um loop com o vídeo aberto. Na linha 3, o método .read() retorna 2 elementos, o primeiro é um valor booleano (True/False) e o segundo é um frame do vídeo.
Se a elemento booleano é True, a função que detecta veículos é chamada tendo o frame como seu argumento (linha 6). Em seguida, o frame com veículos detectados é mostrado (linha 7). Os outros comandos da função definem as formas de término do while loop e o fechamento das janelas abertas do vídeo.
def Simulator(video):
while video.isOpened():
ret, frame = video.read()
controlkey = cv2.waitKey(1)
if ret:
carros_frame = detecta_carros(frame)
cv2.imshow('frame', carros_frame)
else:
break
if controlkey == ord('q'):
break
video.release()
cv2.destroyAllWindows()
Após a implementação, basta chamar a função usando um vídeo como argumento. No código abaixo, substitua o termo path_to_video pela localização do seu vídeo.
video = cv2.VideoCapture('path_to_video')
Simulator(video)
Esse é o resultado que obtivemos.
Conclusão
Nesse post, usamos o OpenCV e o classificador Haar cascade para detectar veículos em vídeos. O processo é simples, mas o resultado depende de uma boa escolha dos parâmetros utilizados para a detecção.