A medida que la inteligencia artificial avanza, los robots se utilizan cada vez más para liberar a los humanos de los riesgos de inspeccionar lugares peligrosos o de la tediosa vigilancia visual rutinaria. Para proporcionar cierto grado de decisión autónoma, el robot a menudo tiene cámaras conectadas a una computadora Linux incorporada como una NVIDIA Jetson o una computadora de placa única (SBC) x86.
Si la aplicación se beneficia de videos en vivo de 360 grados, existen dos enfoques. El primero, más difícil, es utilizar múltiples cámaras y unir el video en la computadora o procesar cada alimentación de video por separado. El número de cámaras utilizadas depende del campo de visión de cada cámara. Si el robot utiliza dos lentes ojo de pez que pueden mostrar más de 180 grados, solo se necesitan dos cámaras. Es común usar tres o cuatro cámaras.
Un enfoque más sencillo es utilizar una cámara de 360° para consumidores. En la comunidad de desarrolladores theta360.guide, uno de los temas más populares que los desarrolladores discuten es cómo agregar visión de 360° a su prototipo de robot y alimentar el video en OpenCV.
Aunque hay diferentes formas de transferir el video desde la cámara de 360° al ordenador con Linux, el método más popular es usar un cable USB. El WiFi y Ethernet no son tan populares. Los modelos RICOH THETA V, X y Z1 pueden aparecer como una cámara web USB en el ordenador con Linux. Sin embargo, se requiere un poco de trabajo en Linux. Los ordenadores MacOS pueden usar la cámara RICOH THETA directamente. Para Windows, RICOH proporciona un controlador. Para Linux, RICOH proporciona una versión modificada de libuvc en GitHub llamada libuvc-theta.
Para exponer la cámara como un dispositivo de video a OpenCV, RICOH proporciona un programa de muestra, libuvc-theta-sample. Esto se puede utilizar con v4l2loopback para hacer un dispositivo /dev/video*
disponible para OpenCV.
Para probar la conexión de la cámara al ordenador con Linux, primero conecta un cable USB desde la cámara al ordenador con Linux y sigue estos pasos:
git clone https://github.com/ricohapi/libuvc-theta.git
sudo apt install libjpeg-dev
cd libuvc-theta
mkdir build
cd build
cmake ..
make
sudo make install
cd ../..
git clone https://github.com/ricohapi/libuvc-theta-sample.git
cd libuvc-theta-sample/gst
make
# La THETA debe estar conectada a tu ordenador y en
# modo de transmisión en vivo
./gst_viewer
Cámara de video de 360° mostrada con gstreamer
Si la compilación falla, es posible que necesites bibliotecas adicionales de gstreamer. Esto instalará todas las bibliotecas.
sudo apt-get install \
libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
gstreamer1.0-doc \
gstreamer1.0-tools \
gstreamer1.0-x \
gstreamer1.0-alsa \
gstreamer1.0-gl \
gstreamer1.0-gtk3 \
gstreamer1.0-qt5 \
gstreamer1.0-pulseaudio \
libgstreamer-plugins-base1.0-dev
Además, una Raspberry Pi 4 no funcionará debido a la falta de soporte de decodificación de hardware 4K H.264.
Configuración de /dev/video*
Para hacer que el dispositivo libuvc esté disponible como un dispositivo de video, podemos usar v4l2loopback. La aplicación libuvc-theta-sample utilizará gstreamer para enviar el video a v4l2.
Si solo tienes una cámara de video en tu computadora, entonces debes modificar esta línea antes de ejecutar la compilación. La siguiente línea es para una computadora con la RICOH THETA conectada como la única webcam:
"v4l2sink device=/dev/video0 sync=false";
Acceso Desde OpenCV
Para probar si la cámara se puede usar desde OpenCV, comencemos con un simple redimensionamiento de cuadro.
import cv2
cap = cv2.VideoCapture(0)
# Verificar si la cámara web se abre correctamente
if not cap.isOpened():
raise IOError("Cannot open webcam")
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
cv2.imshow('Input', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
Latencia de la Cámara
La latencia es un gran problema en las discusiones de la comunidad. La latencia de la cámara THETA es de aproximadamente 350ms. Esto es demasiado alto para muchas aplicaciones que requieren que el robot reaccione rápidamente. También es demasiado alto para telepresencia si estás controlando un dron que se mueve alrededor de obstáculos. La latencia se debe al cosido en la cámara de las dos lentes. El cosido no se puede desactivar en la transmisión de video.
Alternativa a v4l2loopback
Dado que v4l2loopback añade complejidad y sobrecarga, el paquete gstthetauvc se puede utilizar para acceder a la cámara directamente desde gstreamer.
Aquí está la misma prueba usando gstthetauvc.
import cv2
# la tubería a continuación funcionó
# cap = cv2.VideoCapture("thetauvcsrc \
# ! decodebin \
# ! autovideoconvert \
# ! video/x-raw,format=BGRx \
# ! queue ! videoconvert \
# ! video/x-raw,format=BGR ! queue ! appsink")
# sugerencia de tubería gracias a nickel110
# intento de forzar la aceleración de hardware
# probado con NVIDIA 510.73 con una antigua GTX 950 en Ubuntu 22.04
cap = cv2.VideoCapture("thetauvcsrc \
! queue \
! h264parse \
! nvdec \
! gldownload \
! queue \
! videoconvert n-threads=0 \
! video/x-raw,format=BGR \
! queue \
! appsink")
if not cap.isOpened():
raise IOError('Cannot open RICOH THETA')
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
cv2.imshow('frame', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
Ejemplos de transmisión de video en 360 grados en vivo
Aquí hay algunos ejemplos de cómo utilizar OpenCV para la transformación de color y detección de bordes.
# Convertir a escala de grises
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Desenfocar la imagen para una mejor detección de bordes
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# Detección de bordes Canny
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Detección de bordes Canny
# Mostrar imagen con detección de bordes Canny
cv2.imshow('Canny Edge Detection', edges)
Detección de personas y monitores en vivo.
La cámara tiene dos lentes. El lado opuesto al botón del obturador es la lente trasera y se colocará en el centro de la escena. La detección de objetos es más precisa cuando el objeto está centrado en la vista equirectangular.
Persona centrada en la lente trasera
Sin embargo, la detección funciona razonablemente bien cuando el humano está en el borde de la vista equirectangular, incluso por la noche. Es posible que necesites entrenar tu modelo en una base de datos de imágenes de ojo de pez o de 360°.
Humano detectado en el borde de la vista equirectangular
Mejorando la Detección
Ahora que tienes la detección básica funcionando en cuadros equirectangulares de una transmisión de video en vivo de 360°, puedes experimentar con diferentes técnicas para mejorar la precisión. Un método es crear múltiples escenas planas de cada cuadro y luego detectar el objeto en cada escena. El video 360° Object Detect(Yolo) en ROS2 rviz2 y KR260 del ingeniero misoji proporciona una buena demostración de esta técnica. También existe una versión de YOLO que ha sido modificada para su uso con video panorámico. Consulta el documento PV-YOLO: Un Modelo de Detección de Objetos para Video Panorámico basado en YOLOv4.
Conclusión
Usando una cámara 360° de consumo, puedes obtener fácilmente que el video de 360° aparezca como una cámara web USB para software como OpenCV. Con el video de 360° accesible ya sea como un dispositivo de video o accedido a través de gstreamer, se puede utilizar software de detección estándar de OpenCV u otro en los fotogramas equirectangulares del video en vivo. Debido a la distorsión de la imagen, el algoritmo de detección de objetos no funcionará tan bien en comparación con una cámara web estándar no 360°. Sin embargo, incluso sin modificación, aún puedes comenzar con alguna detección.
Para realmente utilizar la detección para algo más que un proyecto educativo o de investigación, necesitarás investigar técnicas para mejorar el reconocimiento de los objetos en la vista equirectangular distorsionada.
Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics