2014-05-02 3 views
1

Étant donné deux mappes de quadrillage d'occupation converties en niveaux de gris cv :: Mat, j'ai utilisé le descripteur de fonction ORB et correspond aux entités extraites des deux images. La plupart d'entre eux sont des faux positifs. Ci-dessous, je n'ai montré qu'une relation pour montrer que c'est vraiment un faux positif.Elimination des faux positifs dans les descripteurs de caractéristiques

enter image description here

En fin de compte, ce que je veux faire est de trouver la transformation juste entre la grille de deux cartes d'occupation afin de fusionner leurs cartes dans une carte globalement cohérente. Le code actuel que j'ai est montré ci-dessous:

// Load the two maps 
    nav_msgs::OccupancyGrid map1; 
    initOccupancyGridMap1(map1); 
    nav_msgs::OccupancyGrid map2; 
    initOccupancyGridMap2(map2); 

    // Convert the two maps to grayscale images 
    cv::Mat im1 = cvtMapToMat(map1); 
    cv::Mat im2 = cvtMapToMat(map2); 

    // Feature Descriptor Extraction 
    cv::OrbFeatureDetector featureDetector; 
    cv::OrbDescriptorExtractor featureExtractor; 
    std::vector<cv::KeyPoint> kp1; 
    std::vector<cv::KeyPoint> kp2; 
    cv::Mat d1; 
    cv::Mat d2; 
    std::vector<cv::DMatch> matches; 
    cv::BFMatcher dematc(cv::NORM_HAMMING, false); 
    // 1. Detect keypoints 
    featureDetector.detect(im1, kp1); 
    featureDetector.detect(im2, kp2); 
    // 2. Extract descriptors 
    featureExtractor.compute(im1, kp1, d1); 
    featureExtractor.compute(im2, kp2, d2); 
    // 3. Match keypoints 
    dematc.match(d1, d2, matches); 

    for (int i = 0; i < matches.size(); i++){ 
     std::vector<cv::DMatch> match(1,matches[i]); 

     std::cout << "Distance: " << match[0].distance << std::endl; 
     cv::Mat img_show; 
     drawMatches(im1, kp1, im2, kp2, match, img_show); 
     imshow("Matches", img_show); 
     cv::waitKey(0); 
    } 
+0

double possible de [améliorer l'appariement des points caractéristiques avec OpenCV] (http://stackoverflow.com/questions/17967950/improve-matching-of-feature-points- avec-opencv) – Aurelius

+0

Avez-vous résolu le problème? – nayab

Répondre

0

Afin d'enlever les points qui sont très semblables, j'ai utilisé le deuxième plus proche voisin. Si le point correspond à un point presque égal à un autre, vous ne pouvez pas être sûr que la correspondance est correcte. Par exemple, si votre point A correspond aux points B et C, vous pouvez considérer B un bon résultat s'ils diffèrent d'au moins 25% (cette différence est ce que j'ai choisi, mais vous pouvez essayer avec d'autres nombres). .

Le code ressemble à:

// 2. Extract descriptors 
featureExtractor.compute(im1, kp1, d1); 
featureExtractor.compute(im2, kp2, d2); 
// 3. Match keypoints 

std::vector<cv::DMatch> goodMatches; 
// Instead match only one point, try to match with 2. 
matcher.knnMatch(d1, d2, matches, 2); 

for(int i = 0; i< matches.size(); i++){ // matches from matcher 
    //with this condition we check that the points are at least 25% diferent. 
    if(matches[i].at(0).distance< 0.75*matches[i].at(1).distance){ 
     goodMatches.push_back(matches[i].at(0)); 
    } 
} 
+0

qu'est-ce que nMatches1? – madLokesh

Questions connexes