É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
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);
}
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
Avez-vous résolu le problème? – nayab