Motion como sistema de Vigilância e Segurança

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

O Motion

Logomarca do aplicativo


Site Oficial (antigo): http://lavrsen.dk/foswiki/bin/view/Motion/WebHome
Repositório no GitHub: https://github.com/Motion-Project/motion
Site oficial: https://motion-project.github.io/

O Motion é um programa que monitora sinais de vídeo. Ele é capaz de detectar se uma parte significante da imagem mudou, em outras palavras, ele pode detectar movimento.
O projeto está em processo de migração do site http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome para o GitHub.
Informações mais recentes de atividades no projeto podem ser encontradas na página de notícias.
A documentação para a versão mais recente do código pode ser encontrada aqui. Informações sobre as versões podem ser encontradas aqui.


Situação

Quando pensa-se em organizar um sistema de monitoramento, a questão do hardware é geralmente a que mais leva a atenção, e deve, já um sistema de monitoramento de possuir dispositivos com resoluções de vídeo suficientes para realizar identificações de rostos, placas, etc. Com isso, nem sempre pensa-se em qual software realizará a captura de imagens e pode-se acabar comprando uma solução cara e com limitações, e a sugestão apontada aqui é usar o Motion para isso.


Algumas informações técnicas de hardware e software utilizados

Sistema operacional utilizado: Debian 8 (Jessie) 64 bits, Raspbian 8 (Jessie)
Versão do Motion: 4.0.1+git
Versão do kernel Linux: 3.16.0-4, 4.4 ARM
Número de núcleos de processamento: 8 núcleos, 4 núcleos ARM
Quantidade de memória RAM: 8 gigabytes, 1 gigabyte
Resoluções e marca dos dispositivos de vídeos testados: 640x480 (Creative Technology)(USB), 1280x800 (Axis)(IP), 1280x960 (Axis)(IP), 2592x1944 (Axis)(IP), Foscam (640x480)(IP), EasyN 640X480)(IP)
Servidor: Virtualizado (VMWare) e executado em um Raspberry Pi II modelo B+

Bug na versão 4.0.1

Devido à maior quantidade de recursos, optou-se por utilizar a versão 3.4.1 do software Motion. Essa versão estava disponível no repositório testing oficial do projeto Debian, sendo a mesma substituída pela versão 4.0.1. A versão mais nova, no entanto, possui um bug que faz com que o ffmpeg não opere corretamente. O bug ocorre após a detecção de movimento. Quando a gravação de vídeo é interrompida, ao invés de parar de alimentar o arquivo de vídeo, o mesmo continua sendo alimentado com um quadro nulo. Na prática, o usuário vê a imagem congelar após não ter mais movimento. O que deveria acontecer é, no momento em que não fosse mais detectado movimento, o video deveria ser cortado para o próximo momento de movimento, o que não ocorre. Devido a isso, o arquivo de vídeo acaba ficando com um tamanho em disco maior do que o necessário, além da duração ser maior do que a necessária.

Atualização

Após diversos testes, verificou-se que o problema não ocorre quando o formato de vídeo AVI (mpeg4) é utilizado.

Instalação

Antes de começar os procedimentos, remova quaisquer pacotes de codec conflitantes, do tipo x264, libx264-dev, libavcodec, libavcodec, libavfilter, libavfilter, libavresample, libavutil, libpostproc, libswresample, libswscale, ffmpeg.

root@motion:~# apt purge x264 libx264-dev libavcodec libavcodec libavfilter libavfilter libavresample libavutil libpostproc libswresample libswscale ffmpeg

1. Compilando e instalando o libx264:

root@motion:~# git clone git://git.videolan.org/x264.git
root@motion:~# cd x264
root@motion:~# ./configure --enable-shared --disable-opencl
root@motion:~# make
root@motion:~# make install && ldconfig

2. Compilando e instalando o FFMPEG com suporte ao x264 (para processador ARM 32 bit):

root@motion:~# git clone git://git.ffmpeg.org/ffmpeg
root@motion:~# cd ffmpeg
root@motion:~# ./configure --arch=armhf --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-shared
root@motion:~# make
root@motion:~# make install && ldconfig

2. Compilando e instalando o FFMPEG com suporte ao x264 (para processador ARM 64 bit):

root@motion:~# git clone git://git.ffmpeg.org/ffmpeg
root@motion:~# cd ffmpeg
root@motion:~# ./configure --arch=arm64 --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-shared
root@motion:~# make
root@motion:~# make install && ldconfig


2. Compilando e instalando o FFMPEG com suporte ao x264 (para processador i386):

root@motion:~# git clone git://git.ffmpeg.org/ffmpeg
root@motion:~# cd ffmpeg
root@motion:~# ./configure --arch=i386 --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-shared
root@motion:~# make
root@motion:~# make install && ldconfig

2. Compilando e instalando o FFMPEG com suporte ao x264 (para processador amd64):

root@motion:~# git clone git://git.ffmpeg.org/ffmpeg
root@motion:~# cd ffmpeg
root@motion:~# ./configure --arch=amd64 --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-shared
root@motion:~# make
root@motion:~# make install && ldconfig

3. Instalado a biblioteca jpeg:

root@motion:~# apt install libjpeg-dev

4. Compilando e instalando o motion:

root@motion:~# apt install dh-autoreconf
root@motion:~# wget https://github.com/Motion-Project/motion/archive/master.zip
root@motion:~# unzip master.zip
root@motion:~# cd motion-master
root@motion:~# autoreconf
root@motion:~# ./configure
root@motion:~# make
root@motion:~# make install && ldconfig

Configurando o Motion

Após instalar o Motion, é possível acessar os arquivos de configuração do mesmo em /usr/local/etc/motion.

root@motion:~# cd /usr/local/etc/motion

Após isso, basta modificar o nome do arquivo motion-dist.conf para motion.conf e criar um arquivo chamado camera1.conf:

root@motion:/usr/local/etc/motion# mv motion-dist.conf motion.conf
root@motion:/usr/local/etc/motion# echo "# Camera 1" > camera1.conf

Agora, o arquivo "motion.conf" será modificado. O arquivo "camera1.conf" é um arquivo de configuração auxiliar, todas as opções que forem especificadas nele, substituirão a do arquivo de configuração original.
Segue a lista das principais opções do arquivo de configuração:

videodevice /dev/videoX → É o parâmetro o qual se especifica o dispositivo de vídeo a ser utilizado, geralmente USB. A identificação do dispositivo de vídeo geralmente varia entre /dev/video0, /dev/video1 ...etc.
rotate 0 → Nesse parâmetro, pode ser definida em quantos graus se deseja rotacionar a imagem.
width 640 → Nesse parâmetro é definida a largura da imagem.
height 480 → Nesse parâmetro é definida a altura da imagem.
framerate 30 → Nesse parâmetro, define-se o tanto de quadros que serão apresentado em um segundo. (FPS)
netcam_url valor → Esse parâmetro é destinado à câmeras IPs. O formato da URL pode ser http://exemplo, ftp://exemplo, mjpeg://exemplo, rtsp://exemplo ou file://exemplo.
netcam_userpass usuario:senha → Aqui é definida o usuário e a senha da câmera IP.
rtsp_uses_tcp on/off → Força ou não o uso do protocolo TCP para a obtenção das imagens pelo protocolo rtsp. "On", para usar TCP e "off" para usar UDP.
auto_brightness off/on → Desativa/ativa o controle automático de brilho conforme a luminosidade do ambiente.
brightness 0 → Controle de brilho do dispositivo. Valores vão de 0 à 255.
contrast 0 → Controle de contraste do dispositivo. Valores vão de 0 à 255.
saturation 0 → Controle de profundidade de cor do dispositivo. Valores vão de 0 à 255.
power_line_frequency -1 → Controla o ajuste de branco para compensar a intensidade luminosa do ambiente. Valores podem ser -1, que não modifica a configuração dispositivo, 0, desativa a opção, 1, põe em frequência de 50 Hz, 2, põe em frequência de 60 Hz e 3 põe em modo automático.
threshold 1000 → Define o número de pixels que precisam ser modificados para que seja considerado movimento.
area_detect 1245 → Detecta movimento em uma área pré-definida. A área é organizada em formato de matriz:
1 2 3
4 5 6
7 8 9
Um script ou uma aplicação é disparada quando é definida em "on_area_detected". OBS.: A detecção não fica restrita a essas áreas. No exemplo, a área de detecção corresponde aos números 1245 da matriz.
pre_capture 2 → Define o número de imagens a serem incluídas na gravação antes do movimento ser detectado.
post_capture 2 → Define o número de imagens a serem incluídas na gravação depois do movimento ser detectado.
event_gap 60 → Define o número de segundos necessário sem movimento para que seja considerado o fim de um evento.
output_pictures off → Ao ser detectado movimento, se estiver habilitado (on), uma sequência de imagens será criada.
quality 75 → Define a qualidade, em porcentagem, da sequência de imagens.
picture_type jpeg → Define o formato das imagens.
ffmpeg_output_movies on → Quando detectado movimento, será realizado o registro das imagens em um arquivo de vídeo.
ffmpeg_bps 2000000 → Define o número de bits por segundo. Quanto maior, melhor qualidade e maior tamanho de arquivo.
ffmpeg_variable_bitrate 0 → Define uma taxa de bits por segundo variável. Quando valor 0, essa opção é desabilitada. De 2 à 32, representam uma qualidade de melhor para pior.
ffmpeg_video_codec mpeg4 → Define o formato de arquivo de vídeo a ser criado. Opções disponíveis: mpeg4 = .avi, mpeg1 = .mpg, swf = .swf, flv = .flv, mov = .mov, ogg = .ogg, mp4 = .mp4, mkv = .mkv, e hevc.
ffmpeg_duplicate_frames off → Desativa/ativa a duplicata de quadros para atingir a opção definida em "framerate".
locate_motion_mode on → Valores: on, off, preview. Quando em "on", desenha uma caixa em volta do objeto em movimento. Quando em off, a opção é desativada. Quando em preview, desenha uma caixa apenas na pré-visualização não afetando a gravação.
locate_motion_style redbox → Seleciona o que desenhar quando a opção acima é ativa. Quando "redbox", desenha uma caixa vermelha ao redor do objeto em movimento. Quando "box", desenha uma caixa cinza ao redor do objeto em movimento. Quando "cross", desenha uma cruz no centro do movimento. Quando "redcross", desenha uma cruz vermelha no centro do movimento.
text_right %d/%m/%Y\n%T-%q → Define o formato do texto que ficará no canto inferior direito. As variáveis são: %d = dia, %m = mês, %Y = ano, %T = hora:minuto:segundo, %q = imagem atual. É possível colocar o texto que quiser.
text_left valor → Define o texto que ficará no canto inferior esquerdo. As variáveis são: %d = dia, %m = mês, %Y = ano, %T = hora:minuto:segundo, %q = imagem atual. É possível colocar o texto que quiser.
text_changes on/off → Quando em "on", mostra no canto superior direito o número de pixels alterados. Quando em "off", a função é desabilitada.
text_double on → Quando em "on", mostra o texto duas vezes maior do que originalmente seria. Essa opção é ideal para resoluções a partir de 640x480. Quando em "off", o texto é mostrado no seu tamanho original.
target_dir /home/motion/motion-videos → Define o diretório o qual serão gravados os vídeos e/ou a sequência de imagens.
snapshot_filename %v-%Y%m%d%H%M%S-snapshot → Define o formato do nome das fotos instantâneas que são tiradas através do servidor web. Os parâmetros são: %v = número do evento, %d = dia, %m = mês, %Y = ano, %H = hora, %M = minuto, %S = segundo. É possível também colocar o texto que desejar.
picture_filename %v-%Y%m%d%H%M%S-%q → Define o formato do nome para cada imagem da sequência de imagens. O qual %v = número do evento, %Y = ano, %m = mês, %d = dia, %H = hora, %M = minuto, %S = segundo. É possível colocar o nome que quiser.
movie_filename %d-%m-%Y~%H-%M-%S~%v → Define o formato do nome do aquivo de vídeo gravado quando detectado movimento. O qual %v = número do evento, %Y = ano, %m = mês, %d = dia, %H = hora, %M = minuto, %S = segundo. É possível colocar o nome que quiser.
stream_port 8081 → Define a porta para a transmissão ao vivo. O valor 0 (zero) desabilita essa função.
stream_quality 50 → Define, em porcentagem, a qualidade da transmissão.
stream_motion off/on → Quando em "on", transmite 1 quadro por segundo quando não há movimento detectado, ao ser detectado movimento, a transmissão para a ter a taxa de quadros por segundo normal. Essa opção é ideal para economizar banda de rede. Quando em "off", a função é desativada.
stream_maxrate 20 → Define a quantidade máxima de quadros por segundo na transmissão ao vivo.
stream_localhost off/on → Quando em "on", a transmissão ao vivo pode ser visualizada apenas na máquina a qual está sendo executado o Motion. Quando em "off", a transmissão ao vivo pode visualizada a partir de qualquer dispositivo capacitado.
stream_limit 0 → Limita o número de imagens por conexão.
stream_auth_method 0/1/2 → Define o tipo de autenticação para a transmissão ao vivo. Quando em "0 (zero)", não há autenticação. Quando em "1", ocorre autenticação básica com usuário e senha. Quando em "2", é o método mais seguro de autenticação pois a senha no arquivo de configuração é uma sequência MD5.
stream_authentication usuario:senha → Define o usuário e a senha de acesso à transmissão ao vivo.
webcontrol_port 8080 → Define a porta de acesso ao servidor web.
webcontrol_localhost off → Quando em "on", restringe o acesso ao servidor web apenas ao localhost. Quando em "on", qualquer dispositivo capacitado pode acessar o servidor web.
webcontrol_authentication usuario:senha → Define o usuário e a senha para o servidor web.
quiet on/off → Quando em "on", o Motion não emite beeps quando movimento é detectado. Quando em "off", beeps são emitidos ao detectar-se movimento. OBS.: O Motion nunca emitirá beeps quando executado em segundo plano.
on_event_start valor → Dispara um script ou uma aplicação quando ocorre a primeira detecção de movimento após um período sem movimento. Esse período é definido no parâmetro "event_gap"
on_event_end valor → Dispara um script ou uma aplicação quando um evento é finalizado. Esse período é definido no parâmetro "event_gap".
on_area_detected valor → Dispara um script ou uma aplicação quando movimento é detectado em uma área específica. A área é definida no parâmetro "area_detect".
on_picture_save valor → Dispara um script ou uma aplicação quando uma imagem é salva.
on_motion_detected valor → Dispara um script ou uma aplicação quando movimento é detectado.
on_movie_start valor → Dispara um script ou uma aplicação quando um arquivo de vídeo é criado.
on_movie_end valor → Dispara um script ou uma aplicação quando um arquivo de vídeo é finalizado.
on_camera_lost valor → Dispara um script ou uma aplicação quando a comunicação com a fonte de vídeo é perdida. Isso depende do driver, alguns não detectam que o dispositivo de vídeo não está mais conectado, outros drives podem até travar o processo do Motion! E outros ainda podem até travar o PC! Em sistemas analógicos, essa opção talvez não funcione já que depende muito de como o sintonizador opera os dispositivos.
thread /usr/local/etc/motion/camera1.conf → Define o arquivo de configuração auxiliar utilizado para cada fonte de vídeo. É possível utilizar quantas fontes quiser, dependendo claro, da capacidade de processamento da CPU utilizada. Cada parâmetro especificado no arquivo de configuração auxiliar substituirá o parâmetro definido no arquivo de configuração geral. Isso é útil para a realização de configurações personalizadas para cada fonte de vídeo.

Agora um exemplo de arquivo de configuração principal:
Arquivo "motion.conf":

videodevice /dev/video0
rotate 0
width 640
height 480
framerate 30
rtsp_uses_tcp on
auto_brightness off
brightness 0
contrast 0
saturation 0
power_line_frequency -1
threshold 1000
area_detect 1245
pre_capture 2
post_capture 2
event_gap 60
output_pictures off
quality 75
picture_type jpeg
ffmpeg_output_movies on
ffmpeg_bps 2000000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mpeg4
ffmpeg_duplicate_frames off
locate_motion_mode on
locate_motion_style redbox
text_right %d/%m/%Y\n%T-%q
text_changes on
text_double on
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
picture_filename %v-%Y%m%d%H%M%S-%q
movie_filename %d-%m-%Y~%H-%M-%S~%v
stream_port 0
stream_quality 50
stream_motion on
stream_maxrate 20
stream_localhost off
stream_limit 0
stream_auth_method 1
stream_authentication usuario:senha
webcontrol_port 8080
webcontrol_localhost off
webcontrol_authentication usuario:senha
quiet on
thread /usr/local/etc/motion/camera1.conf
thread /usr/local/etc/motion/camera2.conf

Agora dois exemplos de arquivos de configuração auxiliares:
Arquivo "camera1.conf":

/#Câmera 1
videodevice /dev/video0
stream_port 8081
text_left Camera 1
width 640
height 480
target_dir /home/motion/motion-videos/camera01/

/#Câmera 2
netcam_url rtsp://exemplo/mpeg/video.mpeg
netcam_userpass usuario:senha
stream_port 8082
text_left Camera 2
width 640
height 480
target_dir /home/motion/motion-videos/camera02/

As configurações acima serão aplicadas apenas ao dispositivo definido em "videodevice /dev/video0".

Executando o Motion

Para iniciar a aplicação, basta digitar em um terminal (preferencialmente como root) "motion":

root@motion:~# motion

Servidor Web

Referências Bibliográficas

Site oficial
Repositório no GitHub
Novo site oficial
Compilando x264, FFMPEG e o Motion