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).
Os modelos de câmaras anteriores trabalhavam com uma resolução menor e usavam um sistema de aquisição de imagens diferente.
Parâmetros da câmera
Para começar, algumas palavras sobre os parâmetros técnicos da câmera:
- Resolução máxima: 8 Mpx (3280×2464),
- Modos de vídeo: 1080p30 (Full-HD), 720p60, 640x480p90 (VGA),
- Interface: CSI,
- Peso: 3g,
- Dimensões: 25x24x9 mm.
A câmara é, sem dúvida, caracterizada por pequenas dimensões e peso, graças às quais pode ser facilmente usada nos seus projetos. Ao mesmo tempo, oferece alta resolução (8 Mpx) e aceleração de hardware de codificação de imagem (JPEG e H.264).
Interface CSI
A maioria das câmaras de filmar usam uma interface USB relativamente lenta, por isso pode causar alguns problemas.
O módulo Raspberry Pi Camera HD usa a interface CSI ( Camera Serial Interface), dedicada às câmaras. Graças a isso, o todo não sobrecarrega o barramento USB. Além do mais, esta interface é suportada por um acelerador gráfico (GPU) incorporado no Raspberry Pi.
Conectando a câmera ao Raspberry Pi
Começamos por conectar a câmara:
- No Raspberry Pi, conecte a fita ao conector descrito como CAMERA. A fita deve ser direcionada com contatos prateados para o conector HDMI.
- Monte a fita na câmara para que os contatos prateados estejam voltados para a lente.
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.
Resulta da resolução definida – por padrão é 3280×2464 pixels (ou 8Mpx).
Se tivéssemos um monitor conectado via HDMI ao Raspberry, veríamos uma pré-visualização da imagem da câmara ao tirar uma foto na tela. Infelizmente, a visualização não funciona via VNC.
A visão da visão da câmara é suportada pelo hardware da GPU, por isso não consome tempo da CPU, mas não é visível se nos conectarmos usando o VNC.
Vale a pena ver como surgiu a primeira foto. Se tivermos um monitor conectado ou usar o VNC para visualizar a imagem, basta localizá-la e clicar duas vezes para exibir a imagem. Também pode instalar outros programas que permitem visualizar fotos (por exemplo, eog ou fbi).
Se nos conectarmos com um Raspberry remotamente, será mais conveniente observar a imagem pelo WinSCP discutido anteriormente. Nos conectamos com o Raspberry Pi, fazemos download da foto e assistimos no nosso PC:
É 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.
Usando os atributos descritos, também pode alterar parâmetros como ISO, balanço de branco, brilho ou contraste.
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.
Você pode usar CTRL + W para pesquisar texto em nano.
Salvamos o arquivo. Em seguida, execute o Motion com o comando:
sudo motion
Quando o programa é iniciado, abrimos um navegador da Internet no nosso PC. Na barra de endereços, insira o endereço IP do Raspberry com a porta 8081 (por exemplo, http://192.168.0.25:8081/). Depois de um tempo, devemos ver um pequeno fluxo de nossa webcam (1 FPS):
A qualidade das visualizações apresentadas aqui é degradada pela compressão gif!
Para terminar o programa na imprensa consola CTRL + C.
Como aumentar o FPS?
A transmissão na sua forma atual é muito limitada, portanto, seria apropriado alterar outras opções no arquivo de configuração. Começamos por encontrar um lugar para inserir dois valores:
- framerate (definido para 20),
- stream_maxrate (definido como 20).
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:
Claro, as indicações irão variar dependendo das configurações de resolução e FPS.
Sumário
Os primeiros experimentos com a câmara estão atrás de nós. No próximo episódio, nós cuidaremos da gravação de filmes: comum, lapso de tempo (timelapse) e slow-motion (slowmotion). Antes de passar para a próxima parte do curso, vale a pena se divertir com os parâmetros do raspistill , porque esse programa ainda será necessário.
___________
O que achou deste artigo? Deixe o seu comentário abaixo, e partilhe nas Redes Sociais que certamente será útil e interessante para os seus amigos!
Curso Raspberry Pi – #1 – Introdução, Índice
Curso Raspberry Pi – #2 – O que é o Raspberry Pi?
Curso Raspberry Pi – #3 – Caixa, Dissipadores de Calor
Curso Raspberry Pi – #4 – Instalação do Sistema, Raspberry Pi como PC
Curso Raspberry Pi – #5 – Instalação / Comunicação Via UART
Curso Raspberry Pi – #6 – Instalação / Comunicação Através da Rede
Curso Raspberry Pi – #7 – Acesso Remoto VNC, Chaves SCP, RSA
Curso Raspberry Pi – #8 – O Básico do Linux
Curso Raspberry Pi – #9 – Processadores de Texto
Curso Raspberry Pi – #10 – Câmara, Fotos, Transmissão de Imagem
Curso Raspberry Pi – #11 – Filmes, Slowmotion, Timelapse
Curso Raspberry Pi – #12 – Noções Básicas sobre GPIO, Scripts
Curso Raspberry Pi – #13 – PWM, Entradas, Scripts com uma Câmara