#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;
}
questa è una semplice applicazione per corrispondere punti in due immagini ... ho usato Globo per rilevare punti chiave e FREAK come descrittore su quei punti chiave ... poi brutforcematching per rilevare i punti corrispondenti in due immagini .. Ho preso i migliori 30 punti che si adattano meglio ... spero che questo ti aiuti un po '...
fonte
2012-09-19 17:10:54
Sì, ho indovinato che era qualcosa del genere. Quello che non so è la necessità di usare un rilevatore per i punti chiave se hai un algoritmo per selezionare le coppie. Questo non è abbastanza chiaro per me sul giornale. Sto sviluppando un pyrFAST con freak e vedrò cosa succede. –
La mia comprensione è che, dato un punto chiave (ad esempio usando pyrFAST), il descrittore è calcolato come il segno della differenza tra coppie di punti (! = Il punto chiave) in un piccolo intorno a questo punto chiave. Questo è molto simile a BREVE se hai familiarità con esso. Ma FREAK ha un metodo che campiona le posizioni nel quartiere ispirate al sistema di visione umano. – remi
Ok, questo ha più senso per me. Sì, conosco BRIEF (che campiona posizioni casuali) e BRISK che campiona in cerchi. I campioni FREAK sono anche in cerchi, ma sono ridondanti e grossolani come la retina. Che non ho notato è che questo è fatto in prossimità di un keypoint, che ha un punto. Grazie! –