Actualmente estoy trabajando y comparando el rendimiento de varios detectores de características proporcionados por OpenCV como base para la coincidencia de características visuales.
Estoy usando descriptores SIFT . He logrado una coincidencia satisfactoria (después de rechazar malas coincidencias) al detectar las funciones MSER y DoG (SIFT) .
Actualmente, estoy probando mi código con GFTT (Buenas características para rastrear - Esquinas de Harris) para obtener una comparación, y también porque en la aplicación final, un conjunto de características GFTT estará disponible desde el proceso de seguimiento de características visuales.
Estoy utilizando cv::FeatureDetector::detect(...)
la cual me proporciona un std::vector<cv::KeyPoint>
lleno detectados características / puntos clave / regiones de interés . La estructura cv::KeyPoint
contiene información básica sobre la ubicación de la característica, así como información sobre size
y octave
en la que se ha detectado el punto clave.
Mis primeros resultados con GFTT fueron terribles hasta que comparé lo típico size
y los octave
parámetros en diferentes tipos de características:
- MSER establece el tamaño (entre 10 y 40 px) y deja la octava a 0
- DoG (SIFT) establece tanto el tamaño como la octava (relación tamaño / octava entre 20 y 40)
- GFTT los parámetros son siempre : tamaño = 3 , octava = 0
Supongo que esto se debe a que el propósito principal de las funciones de GFTT no se usaba en la coincidencia, sino solo en el seguimiento. Esto explica la baja calidad de los resultados coincidentes, ya que los descriptores extraídos de características tan pequeñas dejan de ser discriminatorios e invariables para muchas cosas , incluidos los pequeños cambios de 1 píxel.
Si fijo manualmente el size
de GFTT a 10 - 12 , consigo buenos resultados, muy similares a cuando se utiliza MSER o perro (SIFT) .
Mi pregunta es: ¿hay una mejor manera de determinar cuánto aumentar el size
(y / o octave
) que simplemente ir con 10 para ver si funciona ? Quiero evitar hardcoding el size
aumento, si es posible y determinar mediante programación, pero hardcoding está bien , siempre y cuando tengo algunos argumentos sólidos que respaldan mis elecciones de la nueva size
/ size
aumento / size
algoritmo de estimación .
fuente
Respuestas:
No estoy seguro de que haya una buena respuesta a su pregunta precisa: la cuestión del espacio de escala de SIFT y SURF se desarrolló realmente para estimar automáticamente el tamaño de vecindario relevante "bueno" alrededor de un punto clave en forma de esquina (que es lo que tiene buenas características rastrear son).
Ahora, las respuestas más positivas serían:
construya una base de datos de puntos clave y buenas coincidencias (por ejemplo, utilizando patrones de calibración cuadrados) y cree una evaluación de rendimiento automatizada en esta base de datos para encontrar el tamaño correcto. Esta tarea realmente puede ser realmente automatizada (vea el trabajo de Mikolajczyk y Schmid sobre la evaluación de coincidencia de puntos)
incruste sus buenas características en una pirámide de imagen para tener también algún tipo de escala asociada a ellas. Puede buscar referencias en puntos de interés de FAST y Harris a varias escalas, que hacen algo muy similar a este procedimiento.
Para encontrar heurísticamente el tamaño máximo de bloque, puede calcular las estimaciones de sus imágenes con un cuadro borroso (que es más o menos lo que hace el operador blockSize) y ver cuándo desaparece la esquina. Sin embargo, tenga en cuenta que más desenfoque quita la esquina de su verdadera ubicación.
Si realmente está buscando una solución rápida y sucia, pruebe tamaños entre 5x5 y 11x11 (tamaños típicos utilizados en la coincidencia de bloques estéreo). Si está buscando un criterio intelectualmente satisfactorio, intente maximizar la probabilidad de una buena coincidencia de dos puntos de característica bajo su nivel de ruido.
fuente
Para ayudarlo a determinar los mejores parámetros para los detectores, OpenCV tiene el AjusterAdapter para ese propósito. Nunca lo usé yo mismo, pero probablemente sea la forma estándar de determinar mediante programación los parámetros. También tenga en cuenta que aunque los puntos clave tienen varias propiedades, no todos tienen sentido para todos los algoritmos. Debido a que la estructura Keypoint se usa para diferentes algoritmos, tiene todos esos campos pero a veces no se usan, es por eso que obtienes esas octavas = 0; OMI
fuente