Nas últimas três semanas, estivemos a desenvolver e a testar a deteção de movimentos, através da imagem de uma câmara térmica (MLX90641), montada na entrada de uma sala, apontando para baixo.

Decidimos implementar uma pipeline em C++, que consiga processar as frames 12x16, a 16 Hz, fazendo a identificação e o tracking do movimento das pessoas.

Após muitos testes e ajustes, chegámos a uma pipeline que se resume nos seguintes passos:

1. Estimação da temperatura ambiente: cálculo do percentil 25 das temperaturas adquiridas.
2. Máscara binária: identificação dos píxeis acima de um limiar dinâmico (temperatura ambiente + 3 °C).
3. Filtragem morfológica: remoção de ruído e pequenas regiões por operação morfológica de abertura.
4. Filtro Gaussiano: suavização da imagem para melhorar os contornos dos objetos.
5. Segmentação em blobs: aplicação do algoritmo de Watershed com marcadores obtidos pela transformada da distância.
6. Tracking: tracking das blobs entre frames consecutivas. Calculamos a velocidade das blobs, de forma a prevermos a sua posição, e mantemos um score de confiança para remover falsas deteções.
7. Contagem: registo das entradas e saídas, demarcadas por uma linha no centro da imagem.

Com a pipeline finalizada, implementámos a comunicação entre o microcontrolador e o servidor, através de uma ligação TCP, que permite atualizar a ocupação da sala em tempo real.