Infra - Linux

Criando um serviço de monitoramento de vídeo e detector de presença com sua WebCam no Linux

Se você já tem a sua webcam instalada no linux, este tutorial irá explicar como criar um serviço onde o vídeo ao vivo gerado da webcam é analisado permitindo a detecção de movimentos.

por Alessandro de Oliveira Faria



Se você já tem a sua webcam instalada no linux, este tutorial irá explicar como criar um serviço onde o vídeo ao vivo gerado da webcam é analisado permitindo a detecção de movimentos. E para enriquecer o projeto, um esquema elétrico para controlar o movimento giratório da sua webcam pela porta serial.

Com este tutorial você conseguirá montar um sistema de monitoramento simplesmente gravando os quadros quando houver algum movimento. Ou seja o serviço não ficará gravando quadros estáticos, assim consumindo um enorme espaço em disco.

Veja o resultado:

ATENÇÃO: Caso você tenha uma placa de TV cujo o funcionamento não está adequado, talvez este tutorial possa te ajudar: http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=195

Neste link ( http://www.netitec.com.br/linux/images/motion.mpg ) você poderá ver o serviço em funcionamento em um vídeo mpeg, foi ele que me motivou a instalar este pacote.

O download, compilação e instalação:

O download é efetuado no seguinte link: http://motion.sourceforge.net/download/

Podemos efetuar o download através do wget, como no exemplo abaixo:

[root@athlon arquivos]# wget 
http://heanet.dl.sourceforge.net/sourceforge/motion/motion-3.1.10.tar.gz

Após o download, vamos descompactar o pacote com o comando tar:

[root@athlon arquivos]# tar -zxvf motion-3.1.10.tar.gz

Agora vamos compilar o pacote:

 
[root@athlon arquivos]# cd motion-3.1.10
[root@athlon motion-3.1.10]# chmod 777 configure
[root@athlon motion-3.1.10]# ./configure 

[root@athlon motion-3.1.10]# make
 
[root@athlon motion-3.1.10]# make install

Pronto, neste etapa estamos com o software motion instalado em nosso sistema.

Configuração:

Agora vamos fazer os ajustes finos:

Em primeiro lugar vamos criar o arquivo motion.conf dentro de nosso diretório home.

 
[root@athlon motion-3.1.10]# cd ~
[root@athlon root]# cd .motion/
[root@athlon .motion]# cp /usr/local/etc/motion.conf .
[root@athlon .motion]# vi motion.conf 

Agora faremos agora as devidas alterações no arquivo motion.conf.

Defini a localização do dispositivo de vídeo captura.
videodevice /dev/video0

Número de quadros por segundo capturados.
framerate 10

Origem da entrada do vídeo em caso de placas receptoras de TV
input 1

Modo de vídeo 0=PAL-M/=NTSC
norm 1

Dimensão do vídeo
width 320
height 240

Número de pixel mudados na imagem
threshold 1000

Sensibilidade do movimento
noise_level 16

Localizar e desenhar um box em torno do objeto em movimento
locate yes

Gravação do movimento
output_motion yes

Qualidade da JPEG
quality 100

Gerar um arquivo mpeg
ffmpeg_cap_new yes

Usar o ffmpegs para codificar mpeg do movimento em tempo real
ffmpeg_timelaps on

Usar o codificador Berkeley mpeg
mpeg_encode yes

Grava as detecções de movimento
realmotion yes

Tempo máximo do arquivo mpeg (em segundos)
max_mpeg_time 20

Usando o arquivo thread1.conf para instanciação de processo.
thread thread1.conf

Executando o serviço:

Para colocarmos em funcionamento o software, executamos os seguinte comandos:

[root@athlon .motion]# mkdir /seguranca
[root@athlon .motion]# motion -t /seguranca/
Unkown config option: "ffmpeg_cap_new"
Unkown config option: "ffmpeg_timelaps"
Unkown config option: "ffmpeg_bps"
config_thread
thread config file not found: No such file or directory
thread0 device: /dev/video0 input: 1
thread pid: 9553
waiting for threads to finish, pid: 9551
Motion detected
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-06m.jpg
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-06.jpg
Motion detected
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-07m.jpg
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-07.jpg
Motion detected
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-08m.jpg
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/02-08.jpg
Motion detected
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/03-00m.jpg
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/03-00.jpg
Motion detected
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/03-01m.jpg
File of type image/jpg saved to: /seguranca//2004/03/27/16/52/03-01.jpg
Motion detected

Agora basta disponibilizar a pasta segurança no samba o via web para monitora os vídeo de sua webcam. Reparem que os quadro são gravados na seguinte estrutura:

[Path especificado]/ano/mes/dia/hora/minuto-segundo.jpg

Não se esqueça que o serviço gera um mpeg de 20 em 20 segundos (do vídeo ao vivo) conforme configuramos a acima.

Inserindo um movimento giratório na webcam com um motor de passo.

Com um simples programinha em C, alguns componentes e um motor de passo. Podemos criar um movimento giratório na camêra controlado pela porta serial.

Em http://motion.sourceforge.net/tracking/ temos com detalhes de como criar este projeto.

Entretanto o meu sócio cujo cognome é Indio (alexandrecastro@netitec.com.br). Com um cabo paralelo + 1 componente + o Moto de Passo, ele conseguiu substituir a placa inteira, porém tive que usar a porta paralela da impressora.

Bom não vou entrar em maiores detalhes sobre o hardware, qualquer dúvida e mais detalhes, mande um e-mail para o índio (pois esta não é minha praia) .

Eu e o índio desenvolvemos a nossa solução, e segue abaixo o código que eu escrevi em C++. Este fonte manipula o movimento giratório da camêra.

#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#define base 0x378 /* Endereço da porta da impressora */

 
main(int argc, char **argv)
{ 
int j,i,value,flag;
int sinal[8]; 

 
if (ioperm(base,1,1))
fprintf(stderr, "Erro: Usuario nao tem permissao para acessar a porta %x\n", base), exit(1);

 
sinal[1] = 1;
sinal[2] = 3;
sinal[3] = 2;
sinal[4] = 6;
sinal[5] = 4;
sinal[6] = 12;
sinal[7] = 8;
sinal[8] = 9;
 
flag = 1;
while ( 1 )
{
for(j = 1 ; j <= 15 ; j ++)
{
if(flag) value = sinal[1];
else value = sinal[8]; 
 
for(i = 1 ; i<=8 ; i++)
{
outb((unsigned char)value, base);
usleep(1);
if(flag) value = sinal[i];
else value = sinal[9-i]; 
}
} 
flag = !flag;
}
 
} 

Veja como ficou o nosso hardware:

Alessandro de Oliveira Faria

Alessandro de Oliveira Faria - Sócio-proprietário da empresa NETi TECNOLOGIA fundada em Junho de 1996 (http://www.netitec.com.br), empresa especializada em desenvolvimento de software e soluções biométricas, Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia desde 1986 assim propiciando ao mercado soluções em software nas mais diversas linguagens e plataforma, levando o Linux a sério desde 1998 com desenvolvimento de soluções open-source, membro colaborador da comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo captura entre outros projetos.