o Raspberry Pi tem muitos dos melhores acessórios e um que certamente aparecerá nessa lista é o novo Módulo de Câmera 3. Em nossa análise do Raspberry Pi Camera Module 3dissemos que adoramos o autofoco rápido e as imagens HDR e queremos compartilhar esses recursos com você neste tutorial.
Se você nunca usou uma câmera Raspberry Pi antes, nosso guia do iniciante para Picamera2 é uma ótima cartilha para fazer seu Pi tirar ótimas fotos. Neste tutorial, exploraremos as várias maneiras pelas quais podemos usar o sistema de foco do Camera Module 3 com o Picamera2 e aprenderemos como tirar imagens HDR com um script rápido e simples que automatiza o processo. Se você não gosta de Python, então o Camera Module 3 também pode ser controlado usando libcamera através do terminal.
Conhecendo o foco automático
O foco automático possui três modos nos quais opera.
- Manual: Exigir que o usuário especifique o controle LensPosition para alterar o foco da lente. Um valor de zero produzirá um foco infinito. Valores até 10 são aceitos com 10 configurando o foco para 1/10 de metro (10CM).
- Auto: O foco automático típico que usa AfTrigger para iniciar um ciclo de foco automático.
- Contínuo: A câmera buscará um alvo, focando novamente no alvo quando o algoritmo o detectar.
Projeto 1: Usando o Foco Contínuo
O foco contínuo usa um algoritmo para procurar um alvo no fluxo de imagem. Não importa se o alvo está próximo (cerca de 10cm) ou distante, o algoritmo irá encontrar o alvo e travá-lo. Mas como podemos usá-lo? Vamos fazer um teste rápido. Usaremos um modo de foco contínuo para buscar o melhor foco possível em nosso alvo. Seria útil ter um objeto que você pudesse segurar na câmera, usamos uma nota de um dólar.
1. No menu principal, abra Programação >> Thonny.
2. Importar Picamera2.
from picamera2 import Picamera2
3. Importe a classe de controles da libcamera. Com isso, podemos configurar a câmera para atender às nossas necessidades.
from libcamera import controls
4. Crie um objeto, picam2 que usaremos como um link entre o código e nossa câmera.
picam2 = Picamera2()
5. Inicie uma janela de visualização. A visualização é onde vemos a saída da câmera.
picam2.start(show_preview=True)
6. Defina o AfMode (modo de focagem automática) para ser contínuo.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
7. Salve o código como AFtest.py.
8. Clique em Executar para iniciar o código. Uma janela de visualização aparecerá. Mova um objeto, escolhemos uma nota de um dólar, ao redor do quadro e observe como o foco muda. Tente mover o objeto para mais perto da lente, lembre-se que o ponto de foco mais próximo é de 10 centímetros.
Listagem de código completa
from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
Projeto 2: Definindo o Foco Manualmente
Às vezes, um foco fixo é o que precisamos para obter aquela ótima foto. Afinal, não queremos capturar uma bagunça embaçada. Fixar o foco é relativamente simples; na verdade, é tão fácil que podemos reutilizar a maior parte do código do exemplo anterior.
1. Usar Salvar como no exemplo anterior to crie um novo arquivo chamado ManualFocusTest.py
2. Altere a última linha para usar LensPositionneste caso, defina o valor como 0,0 para um foco infinito.
picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 0.0})
3. Execute o código. Observe como o foco é nítido para objetos distantes, mas de perto eles ficam desfocados.
4. Altere o valor LensPosition para 0,5. Isso nos dará aproximadamente uma distância focal de 50 cm.
5. Salve e execute o código. Mova um objeto na direção e para fora da câmera. Observe como o foco fica nítido em torno de 50 cm.
Listagem de código completa
from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 0.5})
Projeto 3: Foco rápido para várias imagens
Seja uma câmera de pássaros, um dia de esportes na escola ou segurança doméstica, às vezes precisamos obter uma série de imagens nítidas. Felizmente, podemos configurar o Camera Module 3 para tirar uma série de imagens rápidas e definir o foco automático para alta velocidade.
1. Crie um novo arquivo chamado AfFastFocus.py
2. Importar Picamera2.
from picamera2 import Picamera2
3. Importe a classe de controles da libcamera. Com isso, podemos configurar a câmera para atender às nossas necessidades.
from libcamera import controls
4. Crie um objeto, picam2 que usaremos como um link entre o código e nossa câmera.
picam2 = Picamera2()
5. Inicie uma janela de visualização. A visualização é onde vemos a saída da câmera.
picam2.start(show_preview=True)
6. Defina o modo de foco automático como Contínuo e defina o AfSpeed como Rápido.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
7. Defina a câmera para capturar três arquivos, com um atraso de meio segundo entre cada foto. O nome de arquivo “fastfocus.jpg” acrescentará 0, depois 1 e 2 a cada arquivo. Dando-nos três arquivos em ordem numérica.
picam2.start_and_capture_files("fastfocus{:d}.jpg", num_files=3, delay=0.5)
8. Feche a janela de visualização.
picam2.stop_preview()
9. Feche a conexão da câmera.
picam2.stop()
10. Salve e execute o código. Segure um objeto em três distâncias diferentes da câmera e observe como o foco muda, a janela de visualização congela enquanto a câmera tira uma foto e depois libera para a próxima foto. Depois de tiradas três fotos, a janela de visualização será fechada.
Listagem de código completa
from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
picam2.start_and_capture_files("fastfocus-test{:d}.jpg", num_files=3, delay=0.5)
picam2.stop_preview()
picam2.stop()
Capturando uma imagem HDR com o Picamera2
As imagens HDR (High Dynamic Range) podem ser facilmente capturadas com libcamera. Só precisamos passar o argumento –hdr quando executamos o comando. Mas para Picamera2, precisamos executar um comando de terminal antes de executar nosso código Python.
O HDR aumenta a faixa de luminosidade dinâmica das imagens. Com HDR, obtemos uma escuridão mais profunda e imagens mais brilhantes. Isso funciona capturando várias imagens da mesma cena, cada uma com exposições diferentes. Essas imagens são então combinadas em uma única imagem que abrange todo o intervalo. O Módulo de câmera 3 pode capturar imagens HDR, mas não na resolução total de 12 MP. Em vez disso, obtemos uma imagem de 3MP com resolução de 2304 x 1296 pixels.
Para o nosso teste, vamos reutilizar o código do AfFastFocus.py projeto, para capturar uma série de imagens HDR. Também usaremos a biblioteca do sistema operacional Python para executar um comando de terminal que ativará e desativará a configuração HDR sem interação do usuário. Isso significa que não esqueceremos de ativar e desativar as configurações de HDR.
1. Crie um novo arquivo chamado HDRAfFastFocus.py
2. Importar Picamera2.
from picamera2 import Picamera2
3. Importe a classe de controles da libcamera. Com isso, podemos configurar a câmera para atender às nossas necessidades.
from libcamera import controls
4. Importar o módulo do sistema operacional. Isso permite que nosso código interaja com o sistema operacional subjacente, neste caso o Raspberry Pi OS (Linux).
import os
5. Crie um objeto, picam2 que usaremos como um link entre o código e nossa câmera.
picam2 = Picamera2()
6. Use a função do sistema do módulo os para configurar a câmera para usar HDR. Picamera2 suporta HDR, mas não diretamente no módulo. O problema é com V4L2, a interface do kernel entre a câmera e o sistema de vídeo Linux. No momento, ele não oferece suporte pronto para HDR com esta câmera, então temos que executar esta solução rápida para disponibilizá-lo no Picamera2.
7. Imprimir uma mensagem para o Python Shell nos informando que o HDR está ativado.
print("Setting HDR to ON")
8. Inicie uma janela de visualização. A visualização é onde vemos a saída da câmera.
picam2.start(show_preview=True)
9. Defina o modo de foco automático como Contínuo e defina o AfSpeed para rápido.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
10. Defina a câmera para capturar três arquivos, com um atraso de um segundo entre cada foto. O nome de arquivo “HDRfastfocus.jpg acrescentará 0, depois 1 e 2 a cada arquivo. Dando-nos três arquivos em ordem numérica. Dobramos o atraso entre cada foto para dar tempo à câmera de salvar a imagem anterior e, em seguida, definir o foco para a próxima imagem. Testamos com um atraso de 0,5 e nossas fotos às vezes ficavam um pouco desfocadas demais.
picam2.start_and_capture_files("HDRfastfocus{:d}.jpg", num_files=3, delay=1)
11. Feche a janela de visualização.
picam2.stop_preview()
12. Feche a conexão da câmera.
picam2.stop()
13. Imprimir uma mensagem para o usuário que o HDR agora está desativado e, em seguida, execute o comando usando os.system.
print("Setting HDR to OFF")
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0")
14. Salve e execute o código. Segure um objeto em três distâncias diferentes da câmera e observe como o foco muda, a janela de visualização congela enquanto a câmera tira uma foto e depois libera para a próxima foto. Depois que três fotos forem tiradas, a janela de visualização será fechada.
Listagem de código completa
from picamera2 import Picamera2
from libcamera import controls
import os
picam2 = Picamera2()
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0")
print("Setting HDR to ON")
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
picam2.start_and_capture_files("HDRfastfocus{:d}.jpg", num_files=3, delay=1)
picam2.stop_preview()
picam2.stop()
print("Setting HDR to OFF")
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0")