Cómo usar el módulo de cámara Raspberry Pi 3 con código Python
Él frambuesa pi tiene muchos los mejores accesorios y uno que seguro aparecerá en esa lista es el nuevo Módulo de Cámara 3 Nuestra revisión del módulo de cámara Raspberry Pi 3Hemos dicho que nos encanta el enfoque automático rápido y las fotos HDR, y queremos compartir contigo cómo hacer estas funciones.
Si nunca antes ha usado una cámara Raspberry Pi, nuestra Guía de inicio de Picamera2 Es una excelente base para lograr que su Pi tome excelentes fotografías. De esta manera, exploraremos las muchas formas en que podemos usar el sistema de enfoque de Camera Module 3 con Picamera2 y aprenderemos a capturar imágenes HDR con un script rápido y simple que automatiza el proceso. Si Python no es lo tuyo, también se puede controlar usando Camera Module 3 libcamera a través de la terminal.
Conociendo el enfoque automático
Hay tres modos en los que funciona el enfoque automático.
- Instrucción: Para cambiar el enfoque de la lente, el usuario debe configurar el control LensPosition. Un valor de cero creará un enfoque infinito. Se aceptan valores hasta 10 ajustando el foco a 1/10 de metro (10CM).
- Automático: Un enfoque automático típico que utiliza un AfTrigger para iniciar el ciclo de enfoque automático.
- Resistente: La cámara buscará el objetivo y, cuando el algoritmo lo detecte, lo volverá a enfocar.
Proyecto 1: Uso del enfoque continuo
El enfoque continuo utiliza un algoritmo para buscar un objetivo en el flujo de imágenes. No importa si el objetivo está cerca (unos 10 cm) o lejos, el algoritmo encontrará el objetivo y lo bloqueará. Pero, ¿cómo lo usamos? Hagamos una prueba rápida. Usaremos el modo de enfoque continuo para buscar el mejor enfoque posible en nuestro objetivo. Sería útil tener algo que puedas sostener frente a la cámara, usamos un billete de un dólar.
1. Abra Programación >> Thonny desde el menú principal.
2. Importar picamera2.
from picamera2 import Picamera2
3. Importe la clase de control de libcamera. Con esto podremos configurar la cámara según nuestros requerimientos.
from libcamera import controls
4. Crear un objeto, picam2 usaremos como enlace entre el código y nuestra cámara.
picam2 = Picamera2()
5. Inicie la ventana de vista previa. La vista previa es donde vemos la salida de la cámara.
picam2.start(show_preview=True)
6. Establezca AfMode (modo de enfoque automático) en continuo.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
7. Guarde el código como AFtest.py.
8. Haga clic en el botón Ejecutar para iniciar el código. Aparecerá una ventana de vista previa. Mover un objeto, seleccionamos un billete de dólar alrededor del marco y observamos cómo cambiaba el enfoque. Intenta acercar la lente a la lente, recuerda que el punto de enfoque más cercano está a 10 centímetros.
Lista completa de códigos
from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
Proyecto 2: Establecer el enfoque manualmente
A veces, un enfoque constante es todo lo que necesitamos para obtener esa gran toma. Después de todo, no queremos terminar con un lío borroso. Fijar el foco es relativamente simple; de hecho, es tan fácil que podemos reutilizar gran parte del código del ejemplo anterior.
1. Usar como Guardar t en el ejemplo anterioro Cree un nuevo archivo llamado ManualFocusTest.py
2. Cambia la última línea para usar LensPositionen este caso, establezca el valor en 0,0 para el enfoque infinito.
picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 0.0})
3. Ejecute el código. Observe cómo el enfoque es nítido para objetos distantes, pero borroso cuando se ve de cerca.
4. Cambie el valor de LensPosition a 0,5. Esto nos dará una distancia focal de unos 50 cm.
5. Guarde y ejecute el código. Mueve el sujeto acercándolo y alejándolo de la cámara. Observe cómo el enfoque se agudiza alrededor de 50 cm.
Lista completa de códigos
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})
Proyecto 3: enfoque rápido para múltiples imágenes
Ya sea una cámara para pájaros, un día deportivo en la escuela o seguridad en el hogar, a veces necesitamos obtener una serie de imágenes nítidas. Afortunadamente, podemos usar Camera Module 3 para tomar una serie de fotos rápidas y configurar el enfoque automático a alta velocidad.
1. Cree un nuevo archivo llamado AfFastFocus.py
2. Importar picamera2.
from picamera2 import Picamera2
3. Importe la clase de control de libcamera. Con esto podremos configurar la cámara según nuestros requerimientos.
from libcamera import controls
4. Crear un objeto, picam2 usaremos como enlace entre el código y nuestra cámara.
picam2 = Picamera2()
5. Inicie la ventana de vista previa. La vista previa es donde vemos la salida de la cámara.
picam2.start(show_preview=True)
6. Establezca Modo de enfoque automático en Continuo y AfSpeed en Rápido.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
7. Configure la cámara para grabar tres archivos con un retraso de medio segundo entre cada disparo. Un nombre de archivo de “fastfocus.jpg” agregará un 0, luego un 1 y un 2 a cada archivo. Nos da tres archivos en orden numérico.
picam2.start_and_capture_files("fastfocus{:d}.jpg", num_files=3, delay=0.5)
8. Cierra la ventana de vista previa.
picam2.stop_preview()
9. Cierre la conexión de la cámara.
picam2.stop()
10 Guarde y ejecute el código. Sostenga un sujeto a tres distancias diferentes de la cámara y observe cómo cambia el enfoque, la ventana de vista previa se congela cuando la cámara toma una foto y luego se libera para la siguiente toma. Después de que se hayan tomado tres fotogramas, la ventana de vista previa se cerrará.
Lista completa de códigos
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()
Captura de imagen HDR con Picamera2
Las imágenes HDR (alto rango dinámico) se pueden capturar fácilmente cámara libre. Solo necesitamos pasar el argumento –hdr mientras ejecutamos el comando. Pero antes de ejecutar nuestro código Python para Picamera2, debemos ejecutar un comando de terminal.
HDR aumenta el rango dinámico de brillo de las imágenes. Con HDR, obtenemos oscuros más profundos e imágenes más brillantes. Funciona tomando varias fotos de la misma escena, cada una con una exposición diferente. Estas imágenes luego se combinan en una sola imagen que cubre todo el rango. El módulo de cámara 3 puede capturar imágenes HDR, pero no con la resolución completa de 12 MP. En cambio, obtenemos una imagen de 3MP con una resolución de 2304 x 1296 píxeles.
Reutilizaremos el código para nuestra prueba. AfFastFocus.py proyecto para capturar una serie de imágenes HDR. También usaremos la biblioteca del sistema operativo de Python para ejecutar un comando de terminal que activará y desactivará la configuración HDR sin ninguna interacción del usuario. Esto significa que no nos olvidaremos de activar y desactivar la configuración de HDR.
1. Cree un nuevo archivo llamado HDRAfFastFocus.py
2. Importar picamera2.
from picamera2 import Picamera2
3. Importe la clase de control de libcamera. Con esto podremos configurar la cámara según nuestros requerimientos.
from libcamera import controls
4. Importar el módulo del sistema operativo. Esto permite que nuestro código interactúe con el sistema operativo subyacente, en este caso, Raspberry Pi OS (Linux).
import os
5. Crear un objeto, picam2 usaremos como enlace entre el código y nuestra cámara.
picam2 = Picamera2()
6. Use la función del sistema del módulo del sistema operativo para permitir que la cámara use HDR. Picamera2 admite HDR, pero no directamente en el módulo. El problema es con V4L2, la interfaz del kernel entre la cámara y el sistema de video Linux. Actualmente, no ofrece compatibilidad inmediata con HDR con esta cámara, por lo que debemos trabajar en esta solución rápida para que esté disponible en Picamera2.
7. Imprime un mensaje en Python Shell Nos dice que HDR está activado.
print("Setting HDR to ON")
8. Inicie la ventana de vista previa. La vista previa es donde vemos la salida de la cámara.
picam2.start(show_preview=True)
9. Establezca el modo de enfoque automático en Continuo y Establezca AfSpeed en Velocidad.
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})
10 Configure la cámara para grabar tres archivos con un segundo de retraso entre cada toma. El nombre de archivo “HDRfastfocus.jpg” agregará un 0, luego un 1 y un 2 a cada archivo. Nos da tres archivos en orden numérico. Duplicamos el retraso entre cada disparo para darle tiempo a la cámara para guardar la imagen anterior y luego establecer el enfoque para la siguiente imagen. Lo probamos con un retraso de 0,5 y nuestro metraje a veces era demasiado borroso.
picam2.start_and_capture_files("HDRfastfocus{:d}.jpg", num_files=3, delay=1)
11 Cierra la ventana de vista previa.
picam2.stop_preview()
12 Cierre la conexión de la cámara.
picam2.stop()
13 Imprimir un mensaje para el usuario HDR está deshabilitado ahora y luego ejecute el comando usando os.system.
print("Setting HDR to OFF")
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0")
14 Guarde y ejecute el código. Sostenga un sujeto a tres distancias diferentes de la cámara y observe cómo cambia el enfoque, la ventana de vista previa se congela cuando la cámara toma una foto y luego se libera para la siguiente toma. Después de que se hayan tomado tres fotogramas, la ventana de vista previa se cerrará.
Lista completa de códigos
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")