2012-09-19 11 views
17

Estoy desarrollando una aplicación que implica el uso de los descriptores Freak, recién publicado en la versión OpenCV2.4.2.OpenCV FREAK: Descriptor Fast Retina KeyPoint

En los documentation sólo dos funciones aparecen:

  • El constructor de la clase

  • Un método confuso selectPairs()

Quiero usar mi propio detector y luego llamar al FREAK descriptor pasando los puntos clave detectados pero no entiendo claramente cómo funciona la clase.

Pregunta:

hacer yo estrictamente necesario utilizar selectPairs()? ¿Es suficiente con solo llamar al FREAK.compute()? Realmente no entiendo cuál es el uso de selectPairs.

Respuesta

18

Solo hojeé el papel y vi en el párrafo 4.2 que los autores establecieron un método para seleccionar los pares de campos receptivos evaluar en su descriptor, ya que tomar todos los pares posibles sería una carga excesiva. La función selectPairs() le permite recalcular este conjunto de pares.

Lea a continuación la documentación donde señalan exactamente a este párrafo en el artículo original. Además, algunos comentarios en la documentación le informan que hay un conjunto de pares aprendido ya disponible y fuera de línea que está listo para usar con el descriptor FREAK. Así que supongo que, al menos para comenzar, podrías usar los pares precalculados y pasar como argumento la lista de KeyPoints que obtuviste de tu método para FREAK.computar.

Si sus resultados son decepcionantes, puede probar el método de selección de punto clave utilizado en el documento original (párrafo 2.1), y finalmente aprender su propio conjunto de pares.

+0

Sí, supuse que era algo así. Lo que no sé es la necesidad de utilizar un detector para los puntos clave si tiene un algoritmo para seleccionar pares. Eso no es lo suficientemente claro para mí en el periódico. Estoy desarrollando un pyrFAST con monstruo y veré qué sucede. –

+1

Tengo entendido que, dada la ubicación de un punto clave (por ejemplo, usando pyrFAST), el descriptor se calcula como el signo de la diferencia entre pares de puntos (! = El punto clave) en un vecindario pequeño alrededor de este punto clave. Esto es muy similar a BREVE si está familiarizado con él. Pero FREAK tiene un método que muestra las ubicaciones en el vecindario inspiradas por el sistema de visión humana – remi

+0

Muy bien, eso tiene más sentido para mí. Sí, sé BREVE (que muestra ubicaciones aleatorias) y BRISK que muestrea en círculos. FREAK también toma muestras en círculos pero son redundantes y gruesas o finas como la retina. Lo que no noté fue que esto se hace en las cercanías de un punto clave, que tiene un punto. ¡Gracias! –

16
#include "iostream" 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include "cv.h" 
#include "highgui.h" 
#include <opencv2/nonfree/nonfree.hpp> 
#include <opencv2/nonfree/features2d.hpp> 
#include <opencv2/flann/flann.hpp> 
#include <opencv2/legacy/legacy.hpp> 
#include <vector> 


using namespace cv; 
using namespace std; 

int main() 
{ 
    Mat image1,image2; 
    image1 = imread("C:\\lena.jpg",0); 
    image2 = imread("C:\\lena1.bmp",0); 

    vector<KeyPoint> keypointsA,keypointsB; 
    Mat descriptorsA,descriptorsB; 

    std::vector<DMatch> matches; 

    OrbFeatureDetector detector(400); 

    FREAK extractor; 

    BruteForceMatcher<Hamming> matcher; 

    detector.detect(image1,keypointsA); 
    detector.detect(image2,keypointsB); 

    extractor.compute(image1,keypointsA,descriptorsA); 
    extractor.compute(image2,keypointsB,descriptorsB); 

    matcher.match(descriptorsA, descriptorsB, matches); 

    int nofmatches = 30; 
    nth_element(matches.begin(),matches.begin()+nofmatches,matches.end()); 
    matches.erase(matches.begin()+nofmatches+1,matches.end()); 

    Mat imgMatch; 
    drawMatches(image1, keypointsA, image2, keypointsB, matches, imgMatch); 

    imshow("matches", imgMatch); 
    waitKey(0); 

    return 0; 
} 

esta es una sencilla aplicación para que coincida con dos puntos en las imágenes ... he utilizado Orbe para detectar puntos clave y Freak como descriptor en esos puntos clave ..., a continuación, brutforcematching para detectar los puntos correspondientes en dos imágenes .. .yo he tomado los 30 mejores puntos que tienen mejor coincidencia ... espero que esto te ayude un poco ...