Перейти к содержимому
Compvision.ru

Recommended Posts

Здравствуйте. Как говорится, дальше в лес, больше дров.

Продолжаю разбирать 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;
}

 

Даю ему фотографии.

 

 

imL.JPG

imR.JPG

Получаю особые точки.

 

 

r.JPG

l.JPG

Глобальная цель: найти матрицу преобразования, которая максимально похоже переводит один снимок во второй.

 

Делаю матчинг полученных особых точек.

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" детектор.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Гм. Сделал "Feature2D.ORB", заработало...

Это значит, SURF не установлен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот, получилось.

 

int main( int argc, char** argv )
{
	// Загружаем изображения: 
	Mat img1 = imread("D:\\feat\\imL.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
	Mat img2 = imread("D:\\feat\\imR.jpg", CV_LOAD_IMAGE_GRAYSCALE);

	Mat i3 = imread("D:\\feat\\imL.jpg");
	Mat i4 = imread("D:\\feat\\imL.jpg");


	// Находим особые точки на каждом изображении. Вычисляем их дескрипторы: 
	Ptr<Feature2D> surf=Algorithm::create<Feature2D>("Feature2D.ORB"); 

	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);


	warpPerspective(i3, i4, H, i4.size());

	imshow("3", i3);
	imshow("4", i4);
	waitKey(0);

	return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 hours ago, Khludenkov said:

Гм. Сделал "Feature2D.ORB", заработало...

Это значит, SURF не установлен?

SURF, как и SIFT, с некоторых пор уехал в nonfree модули, т.ч. он подключается отдельно от Features2d.

На тему матчинга, кстати, могу посоветовать свою древнюю статью о том, как при помощи некоторых простых и вычислительно легких трюков можно повысить точность матчинга. 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо.

К примеру, есть матрица гомографии:

Mat H = findHomography(pt1, pt2, RANSAC, 10);

Можно ли её разложить собственно на сдвиг по x и y, поворот и сжатие/растяжение?

 

В частности для случая аффинного преобразования?

 

Скажите, как переписать матчер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×