Curso Raspberry Pi – #10 – Câmara, Fotos, Transmissão de Imagem

Até agora, discutimos os tópicos mais importantes relacionados à instalação e configuração do Raspberry Pi. É hora de usar as suas habilidades e usar periféricos.

Nós começamos com a câmara! Graças a isso, é possível, tirar fotos, transmitir imagens pela rede e detectar movimento.

 

 

Muitos iniciantes perguntam-se como tirar fotos com uma câmara Raspberry Pi, como detectar movimento e como transmitir a imagem pela rede. Vamos verificar estes 3 cenários nesta parte do curso.

Muitas câmaras diferentes podem ser conectadas ao Raspberry Pi. Nós nos concentramos no uso de uma câmara dedicada a um Raspberry, que é Raspberry Pi Camera HD v2 (o modelo mais recente no momento da publicação do artigo).

 

 

 

 

 

 

Ao conectar a fita: levante o bloqueio do conector, insira a fita e aperte a trava do conector. Empurrar ou puxar o cabo sem levantar o bloqueio pode causar danos mecânicos!

 

 

 

 

 

 

O método de montagem da câmara na caixa atualmente não é o mais importante. Pode, por exemplo, ser aparafusado na frente da caixa ou na aba superior. Não precisa de se preocupar com a orientação da câmara, a imagem pode ser girada programaticamente. Usamos essas duas configurações para testes:

 

 

 

 

 

 

Lançando a câmera no Raspberry Pi

Depois que tudo estiver conectado, execute o Raspberry Pi e conecte-o remotamente via SSH. Depois de iniciar o sistema, é necessário ativar a operação da nova periferia. Para isso, usamos o programa raspi-config já conhecido:

sudo raspi-config

No menu principal, escolha Opções de Interfaces e, em seguida, Câmara . O programa perguntará se queremos iniciar a câmara, o que é claro que concordamos. No final, confirmamos também o desejo de reiniciar o Raspberry.

Tire fotos em Raspberry Pi com raspistill

Começamos com a função básica de tirar fotos. Para este propósito, usaremos o programa raspistill. O uso básico do programa para tirar uma foto é simples. Basta digitar o comando:

raspistill -o test.jpg

Em vez de test.jpg, podemos fornecer qualquer nome ao arquivo. A foto será tirada exatamente 5 segundos após a emissão do comando acima. O arquivo test.jpg será salvo no diretório do qual lançamos o programa raspistill.

Usando o comando anteriormente conhecido ls, podemos verificar se o arquivo foi realmente criado e quanto espaço ele ocupa na memória. A imagem é “bastante pesada”, o tamanho exato depende da imagem que está sendo fotografada, mas geralmente deve-se esperar vários megabytes.

 

 

 

 

 

 

 

 

É isso!!! A nossa primeira foto tirada com o Raspberry Pi! Desta vez, infelizmente, a foto acabou, mas voltaremos a falar nela.

Ajuste de foco

Se as imagens estiverem desfocadas, pode alterar o foco girando a lente da câmara. A operação deve ser realizada muito suavemente à mão ou por alguma pequena ferramenta. Tenha cuidado ao ajustar porque é fácil arranhar a lente!

Como desabilito a visualização?

O primeiro parâmetro que vale a pena conhecer é aquele que desativa a visualização – funciona somente quando o monitor está conectado, portanto a usabilidade dessa função é limitada. A visualização indesejada é desativada, adicionando a opção -n:

raspistill -n -o test.jpg

Como altera o atraso de tirar uma foto?

O momento de tirar uma foto pode ser um pouco surpreendente. Não há mais previsão, mas ainda tem que esperar 5 segundos. Felizmente, o tempo de “tirar uma foto” pode ser alterado usando a opção -t. Seu parâmetro é o atraso de tirar a foto expressa em milissegundos.

Vamos testar como isso funciona:

raspistill -n -o test.jpg -t 100

Não é sem razão que usamos um atraso de 100 ms. Em valores muito pequenos, alguns problemas surgem, por exemplo, usando 1 ms dá uma imagem preta, e pequenos valores causam distorções de cor. Provavelmente, a automação do equilíbrio de brancos precisa de alguns quadros para escolher as configurações. Assim, por segurança, definimos 100 ms. Este é o momento em que a câmara será executada e definirá as opções apropriadas.

Como gira uma foto?

Se quisermos girar a imagem, não precisamos desparafusar a câmara. Basta usar o parâmetro -rot, que gira a imagem pelo ângulo selecionado, sendo um múltiplo de 90°.

raspistill -n -o test_obrot.jpg -t 100 -rot 180

Foto girada:

Como girar a imagem vertical/horizontalmente?

Às vezes, verifica-se que a imagem obtida é refletida vertical ou horizontalmente. Podemos, é claro, converter nosso dispositivo, mas o mais importante é usar a opção de imagem espelhada. Temos uma reflexão horizontal (-hf) e vertical (-vf) à nossa disposição:

raspistill -n -o test.jpg -t 100 -hf -vf

Como muda a resolução de uma foto?

Nem sempre estamos interessados ​​na resolução mais alta, podemos economizar muito espaço reduzindo o tamanho da imagem que está fazendo download. A largura é definida com a opção -w e a altura com -h.

Por exemplo, podemos tirar uma foto na resolução VGA padrão. Se compararmos o tamanho dos arquivos criados mais tarde, veremos rapidamente uma grande diferença, por exemplo, 200 KB em vez de 4 MB.

raspistill -n -o test_VGA.jpg -t 100 -w 640 -h 480

Comparação do tamanho do arquivo:

Resultado da imagem em pequena resolução:

Como insiro uma data no nome do arquivo?

O programa raspistill pode ser executado automaticamente, por exemplo, a cada período de tempo definido ou após a detecção de um evento específico. Nessa situação, seria conveniente salvar muitos arquivos e não substituir o mesmo test.jpg a cada vez. O programa raspistill possui duas opções que permitem usar a hora atual no nome do arquivo.

A opção -dt  permite que você adicione a data e a hora atuais ao nome do arquivo. No entanto, o parâmetro -ts  adiciona o chamado timestamp, ou o número de segundos desde 1 de janeiro de 1970 (este é um método tradicional de representação de tempo em sistemas Unix). Para usar essas possibilidades no nome do arquivo, precisamos inserir a tag %d, que será substituída pela data em que a foto foi tirada.

Para o teste, podemos emitir os dois comandos a seguir:

raspistill -n -o test_%d.jpg -t 100 -dt
raspistill -n -o test_%d.jpg -t 100 -ts

Nosso primeiro comando criou um arquivo chamado test_121141040.jpg e o outro test_1516543897.jpg (testado em 21 de janeiro às 14:10:40).

Outras configurações de raspistill

Existem muitas opções para o programa, vale a pena tirar um momento para conhecê-las. As informações mais importantes podem ser encontradas na descrição, que aparece depois de executar o comando raspistill sem nenhum parâmetro.

Detalhes podem ser encontrados na descrição:

pi@raspberrypi:~ $ raspistill 
 
raspistill Camera App v1.3.11
 
Runs camera for specific time, and take JPG capture at end if requested
 
usage: raspistill [options]
 
Image parameter commands
 
-?, --help : This help information
-w, --width : Set image width 
-h, --height : Set image height 
-q, --quality : Set jpeg quality <0 to 100>
-r, --raw : Add raw bayer data to jpeg metadata
-o, --output : Output filename  (to write to stdout, use '-o -'). If not specified, no file is saved
-l, --latest : Link latest complete image to filename 
-v, --verbose : Output verbose information during run
-t, --timeout : Time (in ms) before takes picture and shuts down (if not specified, set to 5s)
-th, --thumb : Set thumbnail parameters (x:y:quality) or none
-d, --demo : Run a demo mode (cycle through range of camera options, no capture)
-e, --encoding : Encoding to use for output file (jpg, bmp, gif, png)
-x, --exif : EXIF tag to apply to captures (format as 'key=value') or none
-tl, --timelapse : Timelapse mode. Takes a picture every ms. %d == frame number (Try: -o img_%04d.jpg)
-fp, --fullpreview : Run the preview using the still capture resolution (may reduce preview fps)
-k, --keypress : Wait between captures for a ENTER, X then ENTER to exit
-s, --signal : Wait between captures for a SIGUSR1 or SIGUSR2 from another process
-g, --gl : Draw preview to texture instead of using video render component
-gc, --glcapture : Capture the GL frame-buffer instead of the camera image
-set, --settings : Retrieve camera settings and write to stdout
-cs, --camselect : Select camera . Default 0
-bm, --burst : Enable 'burst capture mode'
-md, --mode : Force sensor mode. 0=auto. See docs for other modes available
-dt, --datetime : Replace output pattern (%d) with DateTime (MonthDayHourMinSec)
-ts, --timestamp : Replace output pattern (%d) with unix timestamp (seconds since 1970)
-fs, --framestart : Starting frame number in output pattern(%d)
-rs, --restart : JPEG Restart interval (default of 0 for none)
 
Preview parameter commands
 
-p, --preview : Preview window settings <'x,y,w,h'>
-f, --fullscreen : Fullscreen preview mode
-op, --opacity : Preview window opacity (0-255)
-n, --nopreview : Do not display a preview window
 
Image parameter commands
 
-sh, --sharpness : Set image sharpness (-100 to 100)
-co, --contrast : Set image contrast (-100 to 100)
-br, --brightness : Set image brightness (0 to 100)
-sa, --saturation : Set image saturation (-100 to 100)
-ISO, --ISO : Set capture ISO
-vs, --vstab : Turn on video stabilisation
-ev, --ev : Set EV compensation - steps of 1/6 stop
-ex, --exposure : Set exposure mode (see Notes)
-fli, --flicker : Set flicker avoid mode (see Notes)
-awb, --awb : Set AWB mode (see Notes)
-ifx, --imxfx : Set image effect (see Notes)
-cfx, --colfx : Set colour effect (U:V)
-mm, --metering : Set metering mode (see Notes)
-rot, --rotation : Set image rotation (0-359)
-hf, --hflip : Set horizontal flip
-vf, --vflip : Set vertical flip
-roi, --roi : Set region of interest (x,y,w,d as normalised coordinates [0.0-1.0])
-ss, --shutter : Set shutter speed in microseconds
-awbg, --awbgains : Set AWB gains - AWB mode must be off
-drc, --drc : Set DRC Level (see Notes)
-st, --stats : Force recomputation of statistics on stills capture pass
-a, --annotate : Enable/Set annotate flags or text
-3d, --stereo : Select stereoscopic mode
-dec, --decimate : Half width/height of stereo image
-3dswap, --3dswap : Swap camera order for stereoscopic
-ae, --annotateex : Set extra annotation parameters (text size, text colour(hex YUV), bg colour(hex YUV))
-ag, --analoggain : Set the analog gain (floating point)
-dg, --digitalgain : Set the digtial gain (floating point)
 
 
Notes
 
Exposure mode options :
off,auto,night,nightpreview,backlight,spotlight,sports,snow,beach,verylong,fixedfps,antishake,fireworks
 
Flicker avoid mode options :
off,auto,50hz,60hz
 
AWB mode options :
off,auto,sun,cloud,shade,tungsten,fluorescent,incandescent,flash,horizon
 
Image Effect mode options :
none,negative,solarise,sketch,denoise,emboss,oilpaint,hatch,gpen,pastel,watercolour,film,blur,saturation,colourswap,washedout,posterise,colourpoint,colourbalance,cartoon
 
Metering Mode options :
average,spot,backlit,matrix
 
Dynamic Range Compression (DRC) options :
off,low,med,high
 
Preview parameter commands
 
-gs, --glscene : GL scene square,teapot,mirror,yuv,sobel,vcsm_square
-gw, --glwin : GL window settings <'x,y,w,h'>

Transmissão de imagem pela rede – pacote Motion

O segundo aplicativo igualmente interessante para a câmara Raspberry Pi é o Motion, que permite, entre outras coisas, transmitir a imagem pela rede. Além disso, também pode ser usado para rastrear o movimento de objetos.

Começamos com a instalação do programa:

sudo apt install motion

A versão padrão do Motion instalado não tem suporte para a nossa câmara, então agora precisamos instalar o driver apropriado: Video4Linux (V4L). Para este fim, nós emitimos o comando:

sudo modprobe bcm2835-v4l2

Agora, um novo dispositivo aparecerá no diretório/dev, que corresponderá à câmera:/dev/video0.

Esta é a interface padrão usada pelas câmaras no Linux!

O Motion instalado tem muitas possibilidades e muitas opções disponíveis. O arquivo de configurações padrão é /etc/motion/motion.conf. Ter acesso ao diretório/etc requer direitos de administrador, portanto, editamos o arquivo com o seguinte comando:

sudo nano /etc/motion/motion.conf

Depois de executar o arquivo, precisamos de fazer algumas alterações importantes. Primeiro, encontramos a linha na qual a opção stream_localhost está localizada. Por padrão, é ligado (on), nós o desabilitamos.

 

 

 

 

 

 

Nós salvamos as configurações e executamos o programa novamente. Desta vez, a imagem no navegador deve ser definitivamente melhor:

Como aumentar a resolução?

Outra mudança que vale a pena introduzir é aumentar a resolução da imagem. Nós mudamos duas opções:

  • largura (definida para 640),
  • altura (definida para 480).

Salve o arquivo de configuração e execute a visualização:

A partir de agora, o nosso Raspberry Pi pode ser usado como uma simples câmara de monitoramento!

Detecção de movimento no Raspberry Pi

Como podemos ver, mudamos o Raspberry Pi para uma webcam. Vale lembrar que o Motion excede significativamente as capacidades de webcams típicas. Ele permite detectar movimentos, gerar eventos após a detecção de um intruso, capturar fotos ou vídeos automaticamente, notificação de eventos, etc.

Para o teste, pode executar, por exemplo, a opção responsável pelo rastreamento do tráfego. Para fazer isso, simplesmente ative a opção no arquivo de configuração, que é chamado de  locate_motion_mode (mude de off para on). De agora em diante, os elementos móveis serão delineados com um retângulo. Para que o item seja delineado com um retângulo vermelho, altere  locate_motion_style para redbox.

Começando a transmissão em segundo plano

O método acima de executar o Motion fez com que durante a operação do programa o nosso terminal fosse bloqueado e não pudéssemos fazer nada a respeito. Raspberry Pi pode realizar muitas tarefas, por isso é uma pena “bloquear” um Raspberry com um programa. Podemos facilmente fazer o Motion rodar em segundo plano, ou como um serviço (tais programas são chamados daemon / demons).

Para tornar isso possível, podemos:

  • Opção 1: altere a opção daemon de off para on no arquivo de configuração;
  • Variante 2: execute o programa com o parâmetro -b.

Para controlar os serviços no Linux, o programa systemctl é usado :

  • Exibição de status: sudo systemctl status motion.service;
  • Pare o serviço: sudo systemctl stop motion.service;
  • Iniciando o serviço:  sudo systemctl start motion.service.

Um exemplo de uso de serviços na prática:

Quando o serviço estiver a ser executado em segundo plano, poderá ativar o programa htop descrito anteriormente, no qual é possível visualizar o consumo atual de recursos do Raspberry Pi: