Я пытаюсь извлечь и сопоставить функции с OpenCV, используя ORB для обнаружения и FLANN для сопоставления, и я получаю действительно странный результат. После загрузки мои 2 изображений и конвертирования их в оттенках серого, вот мой код:C++ - обнаружение функции OpenCV с ORB
// Initiate ORB detector
Ptr<FeatureDetector> detector = ORB::create();
// find the keypoints and descriptors with ORB
detector->detect(gray_image1, keypoints_object);
detector->detect(gray_image2, keypoints_scene);
Ptr<DescriptorExtractor> extractor = ORB::create();
extractor->compute(gray_image1, keypoints_object, descriptors_object);
extractor->compute(gray_image2, keypoints_scene, descriptors_scene);
// Flann needs the descriptors to be of type CV_32F
descriptors_scene.convertTo(descriptors_scene, CV_32F);
descriptors_object.convertTo(descriptors_object, CV_32F);
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_object, descriptors_scene, matches);
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for(int i = 0; i < descriptors_object.rows; i++)
{
double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
//-- Use only "good" matches (i.e. whose distance is less than 3*min_dist)
vector<DMatch> good_matches;
for(int i = 0; i < descriptors_object.rows; i++)
{
if(matches[i].distance < 3*min_dist)
{
good_matches.push_back(matches[i]);
}
}
vector<Point2f> obj;
vector<Point2f> scene;
for(int i = 0; i < good_matches.size(); i++)
{
//-- Get the keypoints from the good matches
obj.push_back(keypoints_object[ good_matches[i].queryIdx ].pt);
scene.push_back(keypoints_scene[ good_matches[i].trainIdx ].pt);
}
// Find the Homography Matrix
Mat H = findHomography(obj, scene, CV_RANSAC);
// Use the Homography Matrix to warp the images
cv::Mat result;
warpPerspective(image1,result,H,Size(image1.cols+image2.cols,image1.rows));
cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows));
image2.copyTo(half);
imshow("Result", result);
И это снимок экрана странного результата я получаю: screen shot
Что может быть проблема?
Спасибо!
Кажется, результат плохого согласования - расчетное преобразование приводит к «нереалистичным» результатам. Взгляните на матчи, как это делается в [примере] (http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html) – PhilLab
Я делаю то же самое, нет? Единственное отличие состоит в том, что в их примере используется SurfDescriptorExtractor, который не является бесплатным для использования, поэтому я не могу его использовать. – YaronGh
Но вы используете разные изображения - возможно, ваши изображения не соответствуют этому. Взгляните на свои матчи через '' imshow («Хорошие совпадения», img_matches); '' (см. Пример) – PhilLab