Ver artículos anteriores: algoritmo de reconocimiento de movimiento simple y un algoritmo para encontrar el desplazamiento de objetos en la imagen . Permítanme recordarles que para escribir estos artículos me motivó el hecho de que cuando comencé a trabajar en mi tesis de maestría sobre "Análisis de la estructura espacial de imágenes dinámicas", me encontré con el problema de que es muy difícil encontrar algunos ejemplos de algoritmos listos para reconocer imágenes y objetos en movimiento. En todas partes, tanto en la literatura como en Internet, solo hay una teoría desnuda. Ha pasado bastante tiempo desde entonces, logré defender con éxito mi tesis y recibir un diploma rojo, y ahora estoy escribiendo para compartir mi experiencia.
Entonces, cuando comencé a trabajar en mis disertaciones, mi conocimiento en el campo de la visión por computadora era cero. Por donde empecé De los experimentos más simples sobre imágenes, que se describen en los artículos anteriores. Escribí un par de algoritmos primitivos, uno de los cuales me mostró en forma de puntos donde se encuentran los objetos en movimiento, y el segundo encontró una parte de la imagen en una imagen más grande (funcionó, naturalmente, lentamente).
¿Que sigue? Enchufar más. Mi tarea era que el vehículo aéreo no tripulado navegara a través de fotografías aéreas o rastreara un automóvil en movimiento por la carretera. Y no tenía ni idea de cómo empezar la tarea. ¿Qué he empezado a hacer? Leer teoría. Y la teoría decía que la visión por computadora se divide en las siguientes etapas:
- Preprocesamiento de imágenes (eliminación de ruido, mejora del contraste, escalado, etc.).
- Encontrar detalles (líneas, bordes, puntos de interés)
- Detección, segmentación.
- Procesamiento de alto nivel.
Bueno, vale, dibujé un diagrama del programa que debería hacer todo esto:

En resumen, resultó que tenía que crear algo grandioso a nivel de Inteligencia Artificial. Bien, intentaré crearlo. Tomo Visual Studio y comienzo a esculpir clases en C #. Más precisamente, espacios en blanco de clase. Un poco después me di cuenta de lo que estaba apuntando….
Entonces, comienzo a practicar el primer paso. Preprocesamiento. Empecé con ella porque
- Este es el más simple.
- Este es el primer paso de la lista.
Comencé a aplicar diferentes filtros a la imagen, para ver qué pasaba. Intenté, por ejemplo, aplicar el filtro Sobel:

Eliminar el ruido de la imagen mediante el desenfoque gaussiano:

estudié el filtrado de la mediana y la selección de bordes:

la conferencia sobre visión por computadora de la sala de conferencias me ayudó mucho .
Entonces, hay mucho más conocimiento, pero aún no está claro cómo resolver el problema. En ese momento, el tema y la tarea de la tesis de maestría había sido revisado varias veces, y como resultado se formuló de la siguiente manera: "Seguimiento de la trayectoria de un UAV mediante marcos de fotografía aérea". Es decir, necesitaba tomar varias fotografías y construir una trayectoria a lo largo de ellas.
Tuve la idea de describir el contorno en forma de líneas discontinuas (descritas por muchos segmentos) y luego comparar cuánto se han desplazado estas líneas. Pero resultó que los contornos, incluso en dos cuadros adyacentes, eran tan diferentes que no había forma de comparar adecuadamente los conjuntos de líneas discontinuas resultantes. Traté de mejorar los contornos usando varios métodos y sus combinaciones:
- Selección clásica de bordes Canny de la biblioteca OpenCV
- Algoritmo de detección de bordes mejorado desarrollado por mi supervisor.
- Selección de contornos por binarización.
- Selección de contornos por segmentación. La segmentación se llevó a cabo de varias formas, en particular, utilizando características de textura.
Como resultado, obtuvimos una mezcla de algoritmos que funcionaron muy lentamente pero no acercaron ni un ápice al resultado. Parte de mi trabajo se utilizó como material para este artículo .
Bueno, entonces el supervisor sugirió una idea: necesitas usar puntos especiales. E incluso dio un algoritmo sobre cómo calcular estos puntos clave. Debo decir que este fue un método muy poco estándar. Este no es un detector Harris, ni BRISK, ni MSER, ni AKAZE. Aunque intenté usarlos también. Pero resultó que el detector propuesto por el asesor científico funcionó mejor. Y así es como funciona. Primero, calculamos la preparación del contorno usando esta fórmula:


Luego encontramos los extremos de esta función. Estos son los puntos especiales. Es revelador que los puntos pueden ser de dos tipos, "picos" y "hoyos". A continuación se muestra un ejemplo de estos puntos en la imagen:

A continuación, se seleccionan 50 puntos con la máxima respuesta de los puntos obtenidos. Para todos estos puntos, se construyen triángulos, la cantidad de triángulos formados por estos puntos es:

donde k es el número de puntos singulares involucrados en el cálculo. Para cada triángulo, se calcula un índice especial de 0 a 16383. El siguiente paso es distribuir los triángulos sobre una matriz especial en la que el número de celda corresponde al índice del triángulo. Cada celda de dicha matriz es una lista de triángulos. Esta matriz se compila a partir de dos marcos comparados. Las comparaciones se realizan haciendo coincidir cada celda en la matriz con la celda correspondiente en la matriz de otro marco. En total, es necesario emparejar 16384 grupos, lo que es una tarea bastante factible para una computadora en un período de tiempo bastante corto.
Al hacer coincidir matrices, completamos la matriz correspondiente. La matriz horizontal son los ángulos entre los triángulos emparejados, y la escala vertical es la escala, que se calcula como la relación de las longitudes de los lados más largos. La escala y el ángulo encontrados es la celda de la matriz que tiene más coincidencias. Se hace una comparación similar para calcular el desplazamiento horizontal y vertical de las imágenes.
Lea más sobre este método en el artículo.
Por lo tanto, encontramos el desplazamiento horizontal y vertical, el ángulo y el cambio de escala (es decir, el UAV subió o bajó). Ahora queda escribir un programa que simule trazar una trayectoria sobre una serie de fotogramas y dibuje esta misma trayectoria, y podemos decir que la disertación está lista:
