opencv feature-descriptor freak

OpenCV FREAK: Descriptor de KeyPoint de Retina Rápido



feature-descriptor (2)

Estoy desarrollando una aplicación que implica el uso de los descriptores de Freak , que se acaba de lanzar en la versión OpenCV2.4.2 .

En la documentation solo aparecen dos funciones:

  • El constructor de la clase

  • Un método confuso selectPairs()

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

Pregunta:

¿Necesito estrictamente usar selectPairs() ? ¿Es suficiente con solo llamar a FREAK.compute() ? Realmente no entiendo cuál es el uso de selectPairs.


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

Lea luego la documentación donde apuntan exactamente a este párrafo en el artículo original. Además, algunos comentarios en la documentación le dicen que hay un conjunto de pares aprendidos fuera de línea ya disponibles que está listo para usar con el descriptor FREAK. Así que supongo que al menos para empezar, solo puede usar los pares precomputados y pasar como argumento la lista de Puntos de clave que obtuvo de su método a FREAK.compute.

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


#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 aplicación simple para hacer coincidir puntos en dos imágenes ... he usado Orb para detectar puntos clave y FREAK como descriptor en esos puntos clave ... luego brutforcematching para detectar los puntos correspondientes en dos imágenes ... he tomado los 30 puntos principales que tienen mejor coincidencia ... espero que esto te ayude un poco ...