Buenas tardes queridos lectores de Habr! Esta es la segunda parte de la historia sobre el uso de la cámara de ojo de pez en el Raspberry Pi 3. La primera parte se puede encontrar
aquí . En este artículo, hablaré sobre calibrar una cámara de ojo de pez y usar la cámara para detectar objetos usando el paquete find_object_2d. A quién le importa, por favor, debajo del gato.
Calibre una cámara de ojo de pez usando camera_calibration
Aquí describo el procedimiento de calibración basado en el
manual oficial en el portal ros.org.
Para realizar la calibración, necesitamos el paquete de calibración de la cámara. Podemos instalarlo con apt:
sudo apt-get install ros-kinetic-camera-calibration
Necesitaremos una plantilla de tablero de ajedrez. Descargue la plantilla del
manual oficial en ros.org e imprímala. Por conveniencia, lo pegué en una tabla de madera contrachapada:

Ejecutemos el programa de calibración:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
Tendremos una foto:

Mueva la plantilla un poco y espere hasta que la plantilla se seleccione en el marco (las líneas de color con puntos no aparecerán en la plantilla).


Mueva la plantilla un poco más hacia un lado. Para realizar con éxito la calibración, necesitamos realizar una serie de movimientos de la plantilla frente a la cámara de lado a lado para que la plantilla caiga en todas las posiciones angulares en el campo de visión de la cámara (izquierda, derecha, arriba y abajo). A la derecha de la ventana de imagen de la cámara en la ventana del programa se encuentra el panel de registro con tres barras de progreso:
- X captura el movimiento del patrón en la dirección izquierda / derecha (horizontal) en el campo de visión de la cámara
- Y captura el movimiento del patrón en la dirección arriba / abajo (horizontal) en el campo de visión de la cámara
- El tamaño captura el enfoque / eliminación de la plantilla de la cámara y la inclinación con respecto a la cámara.
- Inclinación fija la pendiente de la plantilla hacia la izquierda, derecha, arriba y abajo (bisel).
Por lo tanto, para una calibración exitosa, es importante que la plantilla aparezca en diferentes esquinas del marco, ocupe todo el marco y también se incline hacia la izquierda, derecha, arriba y abajo.
Calibrar una cámara de ojo de pez en su Raspberry Pi puede llevar bastante tiempo, así que sea paciente. Mi procedimiento de calibración tomó 20 minutos.
Cuando se completa la calibración, se debe activar el botón Calibrar (resaltado en color):

También podemos ver los resultados de la calibración en el terminal:

Si está satisfecho con el resultado, presione el botón COMMIT. La ventana del programa se cerrará y verá el mensaje "escribiendo datos de calibración en ..." en el terminal.
Verifique que se haya creado el archivo especificado:
ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml
Calibración completada. Ahora los datos de calibración obtenidos se pueden usar en localización visual y algoritmos SLAM en ROS.
Detectar objetos usando find_object_2d
Instalar el
paquete es bastante simple. Instálelo desde el repositorio de apt en Ubuntu 16.04 para ROS Kinetic:
sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash
Ejecute ROS master y rqt_image_view:
roscore roslaunch usb_cam usb_cam-test.launch
Con el siguiente comando, inicie el nodo del detector:
rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
Se abre la ventana del programa de detección:

Aquí veremos el flujo de la cámara y el resultado de la detección de características en los objetos.
Para comenzar, llevaremos a cabo la capacitación de detectores en nuestras instalaciones. Coloque el primer objeto frente a la cámara:

Haga clic derecho en el panel izquierdo de los Objetos en la ventana y se abrirá la opción Agregar objetos de la escena. Seleccione esta opción y se abrirá la ventana para agregar un objeto:

Después de elegir la mejor posición para el objeto, haga clic en el botón Tomar foto para tomar una foto del objeto:

Necesitamos seleccionar el objeto en la imagen. Use el cursor del mouse para seleccionar el objeto:

Haga clic en el botón Siguiente para recortar el objeto en la imagen y pasar al siguiente paso. Después de recortar la imagen, obtenemos el número total de rasgos característicos detectados en el objeto. Solo queda presionar el botón Finalizar para agregar el objeto a la base de datos de objetos detectores entrenados. Aquí vemos el último paso del procedimiento para agregar un objeto:

Como resultado, entrenamos el detector en un objeto. Ahora puede intentar la detección del objeto en la escena:

Dibujemos la posición del objeto detectado en la terminal:
rosrun find_object_2d print_objects_detected
La salida será así:
Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) ---
Hagamos una lista de los temas:
rostopic list
Dos nuevos temas aparecieron en la lista: / objects y / objectsStamped.
Mostramos información sobre los objetos detectados:
rostopic echo /objects
layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] ---
Aquí, los valores segundo y tercero (266.0, 177.0) representan el ancho y la altura del objeto. Todos los demás valores en el campo de datos representan una matriz de homografía 3x3 (utilizada para calcular la posición y orientación del objeto, así como los valores de escala y desplazamiento).
Como muestran las observaciones, find_object_2d hace un mal trabajo al detectar objetos con una textura débil o sin textura (sin textura). Además, el detector no es efectivo cuando detecta un objeto en un ángulo grande con respecto al objeto (si observamos el objeto desde el costado), o a una gran distancia del objeto.

Después de completar el trabajo con el detector, find_object_2d nos ofrecerá guardar los objetos agregados en el disco.
Eso es todo por ahora. ¡Buena suerte a todos y hasta pronto!