2011-05-30 15 views
6

Matching with nothing in the top right cornerOpenCV 2.2 SURF problemas de características coincidentes

que han modificado la aplicación de demostración OpenCV "matching_to_many_images.cpp" para consultar una imagen (izquierda) a unos marcos de la cámara web (derecha). ¿Qué salió mal con la esquina superior derecha de la primera imagen?

Creemos que esto está relacionado con otro problema que tenemos. Comenzamos con una base de datos vacía y solo agregamos características únicas (que no coinciden con las características de nuestra base de datos) pero después de agregar solo tres características, obtenemos una coincidencia con todas las características nuevas ....

estamos usando: SurfFeatureDetector surfFeatureDetector (400,3,4); SurfDescriptorExtractor surfDescriptorExtractor; FlannBasedMatcher flannDescriptorMatcher;

de código completo se puede encontrar en: http://www.copypastecode.com/71973/

+0

Para que sea 100% correcto, es la esquina superior IZQUIERDA de la imagen DERECHA. Necesitamos una forma de filtrar estas coincidencias obviamente falsas, ¿alguna idea? ¿Por qué se detectan estos puntos como coincidencias? – Orka

+0

Debe marcar mi respuesta como la correcta. El real es engañoso. –

Respuesta

10

Creo que esto tiene que ver con los puntos clave de la frontera. El detector detecta los puntos clave, pero para que el descriptor SURF devuelva valores consistentes, necesita datos de píxeles en un bloque de píxeles a su alrededor, que no está disponible en los píxeles del borde. Puede usar el siguiente fragmento para eliminar puntos de borde después de que se detecten los puntos clave pero antes de que se computen los descriptores. Sugiero usar borderSize de 20 o más.

removeBorderKeypoints(vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize) 
{ 
    if(borderSize > 0) 
    { 
     keypoints.erase(remove_if(keypoints.begin(), keypoints.end(), 
           RoiPredicatePic((float)borderSize, (float)borderSize, 
              (float)(imageSize.width - borderSize), 
              (float)(imageSize.height - borderSize))), 
        keypoints.end()); 
    } 
} 

Dónde RoiPredicatePic se implementa como:

struct RoiPredicatePic 
{ 
    RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY) 
    : minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY) 
    {} 

    bool operator()(const cv::KeyPoint& keyPt) const 
    { 
     cv::Point2f pt = keyPt.pt; 
     return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY); 
    } 

    float minX, minY, maxX, maxY; 
}; 

Además, la indexación aproximada vecino más cercano no es la mejor manera para que coincida con las características entre pares de imágenes. Sugeriría que pruebes otros emparejadores más simples.

+0

Limpio, buen punto! En nuestro código de "producción", hemos cambiado a usar el matcher de fuerza bruta. ¡Examinaré estos puntos con tu fragmento de código como guía! – Orka

+0

Esto resolvió el problema que teníamos antes y respondió la pregunta.Lamentablemente, esta no fue la causa de nuestros problemas de coincidencia de bases de datos ... ¡y de nuevo a la depuración! ¡Gracias por tu respuesta! – Maidenone

4

Su enfoque funciona correctamente, pero muestra resultados incorrectos al llamar incorrectamente a la función drawMatches.

Su llamada incorrecta fue algo como esto:

drawMatches(image2, image2Keypoints, image1, image1Keypoints, matches, result); 

La llamada correcta debe ser:

drawMatches(image1, image1Keypoints, image2, image2Keypoints, matches, result); 
3

que enfrentan el mismo problema. Sorprendentemente, la solución no tiene nada que ver con los puntos fronterizos o el matcher KNN. Sólo necesita una estrategia de coincidencia diferente para filtrar "buenos partidos" de la plétora de partidos.

Utilice un NN búsqueda 2, y la siguiente condición-

si la distancia (1er partido) < 0,6 * distancia (segundo partido) de la primera pareja es un "buen partido".

Filtra todas las coincidencias que no cumplan con la condición anterior y llama a drawMatches solo por las "buenas coincidencias". Voila!

Cuestiones relacionadas