给定两个转换为 cv::Mat 灰度的占用网格图,我使用 ORB 特征描述符并匹配从两个图像中提取的特征。其中大部分是误报。在下面,我只展示了一个关系来表明它确实是一个误报。
最终,我想要做的是在两个占用网格地图之间找到正确的转换,以便将它们的地图合并为一个全球一致的地图。我拥有的当前代码如下所示:
// 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);
}