Este fragmento de código utiliza OpenCV para detectar la posición de un marcador en cada cuadro capturado por el dispositivo de video. Según las dimensiones físicas del marcador, también plantea una estimación. Para cada marcador definido, los datos están disponibles a través de UDP, en forma de texto sin formato. Devuelve la traslación de rotación del objeto con respecto a la cámara y las coordenadas XY del centroide 2D del objeto que aparece en la imagen de la cámara. Si un marcador no es visible, los números devueltos serán un NaN.
Tenga en cuenta que este código NO utiliza información temporal para el seguimiento.
En cambio, intenta detectar el marcador y estimar su pose en cada fotograma capturado.
.ini
. Necesita un entorno Python estándar con cv2
y numpy
módulos disponibles. Si bien el código se desarrolló usando Python 2.7 y OpenCV 3.4.1 en una Mac, también debería funcionar con Python 3 y otras plataformas. Aquí hay algunos pasos para crear un marcador: 1. Tome una foto de su objeto y recórtela. Lo ideal es que la resolución sea compatible con tu cámara. 2. Edite el archivo de configuración y asegúrese de que tenga las siguientes líneas configuradas:
[General]
Puedes dejar prácticamente todo igual en la sección general, ¡pero necesitarás calibrar tu cámara! Lea cómo calibrar aquí. Al agregar un nuevo marcador, deberá ajustar la configuración, así que asegúrese de que la imagen de la cámara sea visible.
camera_show_picture = 1
De lo contrario, se agrega un nuevo marcador como una nueva sección en el archivo de configuración.
El encabezado es el nombre fácil de usar del marcador.
[My custom marker]
Especifique el nombre del archivo y las dimensiones físicas del marcador:
marker_file_name = <File name in the same directory or full path>
marker_width = <Units are in mm.>
marker_height = <Units are in mm.>
Al configurar un nuevo marcador, deberá cambiar la siguiente configuración:
marker_minimum_matching_distance = <Decrease it from 50>
marker_minimum_number_of_matches = <Set this to at least 4>
pose_estimation_running_average = <more than 1>
marker_minimum_matching_distance
es inversamente proporcional a la calidad de la coincidencia de características entre la imagen del marcador y la cámara. Si se establece demasiado alto, las características fuera del marcador coincidirán, y si se establece demasiado bajo, no se realizará ninguna coincidencia.
El marker_minimum_number_of_matches
es necesario para la estimación de la pose. Se requieren al menos 4 puntos coincidentes para calcular las coordenadas translation
y los ángulos rotation
. Sin embargo, cuantas más coincidencias se requieran para la transformación, más precisa será la estimación. Si se establece en un valor demasiado alto, la estimación de la pose solo funcionará en unos pocos fotogramas.
Por último, pose_estimation_running_average
establece cuántos datos de posición de fotogramas deben promediarse. Aumente este número si las posiciones devueltas son demasiado "entrecortadas". Sin embargo, cuantos más fotogramas se promedien juntos, mayor será el retraso.
Además, cada canal colour
puede ser cualquier número natural entre 0
y 255
. Los elementos marker_feature_colour_*
sirven para mostrar la ubicación de las coincidencias de buena calidad entre la imagen del marcador y la imagen de la cámara. La configuración de marker_indicator_colour_*
determina el color de un solo indicador, que muestra las coordenadas calculadas por los valores medios de las coincidencias mostradas. Idealmente, este indicador siempre debería estar dentro del marcador y se devuelve en el paquete UDP como centroid
.
marker_feature_colour_R = <0...255>
marker_feature_colour_G = <0...255>
marker_feature_colour_B = <0...255>
marker_indicator_colour_R = <0...255>
marker_indicator_colour_G = <0...255>
marker_indicator_colour_B = <0...255>
python tracker_main.py
¡Buena suerte!