Здравствуйте. Как говорится, дальше в лес, больше дров.
Продолжаю разбирать OpenCV.
Написал такой код.
int main( int argc, char** argv )
{
string imName[2] = {"D:\\feat\\imL.jpg", "D:\\feat\\imR.jpg"};
Ptr<FeaturesFinder> finder;
//finder = new SurfFeaturesFinder();
finder = new OrbFeaturesFinder();
Mat full_img, img;
vector<ImageFeatures> features(2);
vector<Mat> images(2);
vector<Size> full_img_sizes(2);
double seam_work_aspect = 1;
#pragma region Find Features
for (int i = 0; i < 2; ++i)
{
full_img = imread(imName[i], CV_LOAD_IMAGE_GRAYSCALE);
full_img_sizes[i] = full_img.size();
(*finder) (full_img, features[i]);
features[i].img_idx = i;
for(int j = 0; j < features[i].keypoints.size(); ++j){
circle(full_img, features[i].keypoints[j].pt, 3, 255, 1, 8, 0 );
}
imshow(imName[i], full_img);
waitKey(0);
}
finder->collectGarbage();
full_img.release();
img.release();
#pragma endregion
#pragma region Pairwise matching
vector<MatchesInfo> pairwise_matches;
BestOf2NearestMatcher matcher(false, 0.3f);
matcher(features, pairwise_matches);
matcher.collectGarbage();
#pragma endregion
return 0;
}
Даю ему фотографии.
Получаю особые точки.
Глобальная цель: найти матрицу преобразования, которая максимально похоже переводит один снимок во второй.
Делаю матчинг полученных особых точек.
matcher(features, pairwise_matches);
А дальше не знаю что делать...
То есть есть структура pairwise_matches.
Не совсем понял что такое:
query descriptor index, train descriptor index, train image index, and distance between descriptors.
В инете есть много примеров, но что-то они не компилируются.
В частности:
// Загружаем изображения:
Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
// Находим особые точки на каждом изображении
// Вычисляем их дескрипторы:
Ptr<Feature2D>
surf=Algorithm::create<Feature2D>("Feature2D.SURF");
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
surf->operator()(img1, Mat(), keypoints1, descriptors1);
surf->operator()(img2, Mat(), keypoints2, descriptors2);
// Находим наилучшее соответствие между особыми точками
// на изображениях
vector<DMatch> matches;
BFMatcher(NORM_L2, true).match(descriptors1, descriptors2,
matches);
// Находим оптимальное преобразование,
// согласующееся с большинством пар точек.
vector<Point2f> pt1, pt2;
for( size_t i = 0; i < matches.size(); i++ ) {
pt1.push_back(keypoints1[matches[i].queryIdx].pt);
pt2.push_back(keypoints2[matches[i].trainIdx].pt);
}
// H – это матрица оптимального перспективного
// преобразования от img1 к img2
Mat H = findHomography(pt1, pt2, RANSAC, 10);
Не может создать "Feature2D.SURF" детектор.