Jump to content
Compvision.ru
Khludenkov

Параметры матрицы гомографии

Recommended Posts

Здравствуйте.

Скажите, в каком виде внутри opencv представляется матрица гомографии?

Есть ли функции для того, что получить из неё вращение, сдвиг, растяжение?

Нечто вроде

float dy = get_dy_from_Homography(H);
float dx = get_dx_from_Homography(H);
float angle = get_angle_from_Homography(H);

 

Share this post


Link to post
Share on other sites

Спасибо. А в opencv доступ к элементам матрицы такой же? Построчно?

Везде матрицы для изображений приводятся...

Share this post


Link to post
Share on other sites

Я к тому что в документации не указано, в каком виде представлена матрица гомографии. То ли это float, то ли ещё что.

Честно смотрел

http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=findhomography

 

То есть каким образом вытащить значения элементов этой матрицы?

Share this post


Link to post
Share on other sites

Сделал

 

printf("size = %d\r\n", H.elemSize());

На 32-х битном ХР выдаёт 8 (байт?).

Это тип dоuble значит?

Share this post


Link to post
Share on other sites

Сделал:

	for (int i = 0; i < 9; ++i)  
	{
		printf("el = %lf\r\n", H.at<double>(i));
	}

И результаты похожие: последний элемент = 1.

Share this post


Link to post
Share on other sites

Спасибо. Сделал.

Но наверное каждая новая строка должна начинаться с    *(data + stride)

Я так понимаю? Это здесь хорошо, данные по 8 байт, выравнивать не надо.

 

	// H - это матрица оптимального перспективного преобразования от img1 к img2 
	Mat H = findHomography(pt1, pt2, RANSAC, 10);

	double aM = H.at<double>(0);
	printf("aM = %lf\r\n", aM);
	double bM = H.at<double>(1);
	printf("bM = %lf\r\n", bM);
	double cM = H.at<double>(2);
	printf("cM = %lf\r\n", cM);
	double dM = H.at<double>(3);
	printf("dM = %lf\r\n", dM);
	double eM = H.at<double>(4);
	printf("eM = %lf\r\n", eM);
	double fM = H.at<double>(5);
	printf("fM = %lf\r\n", fM);
	double gM = H.at<double>(6);
	printf("gM = %lf\r\n", gM);
	double hM = H.at<double>(7);
	printf("hM = %lf\r\n", hM);
	double iM = H.at<double>(8);
	printf("iM = %lf\r\n", iM);

	double fi = atan(bM / aM);
	printf("fi = %lf\r\n", fi * 57);

	printf("sizeof double = %d\r\n", sizeof(double));
	printf("sizeof float = %d\r\n", sizeof(float));

 

Share this post


Link to post
Share on other sites

А может ещё с матчингом поможете?

Выходные параметры не совсем ясны.

Вот это:

	FlannBasedMatcher matcher;
	std::vector< DMatch > matches;
	matcher.match( descriptors_object, descriptors_scene, matches );

И исходные коды его в сорсах не нашёл.

Я хочу подправить матчер. К примеру, чтобы точки одного изображения всегда имели большее значение по X чем другого.

Share this post


Link to post
Share on other sites

Видимо можно пофильтровать по какому либо критерию найденные особые точки до вычисления дескрипторов и матчинга.

Share this post


Link to post
Share on other sites
On 7/11/2016 at 3:33 PM, Khludenkov said:

А может ещё с матчингом поможете?

Выходные параметры не совсем ясны.

Вот это:


	FlannBasedMatcher matcher;
	std::vector< DMatch > matches;
	matcher.match( descriptors_object, descriptors_scene, matches );

И исходные коды его в сорсах не нашёл.

Я хочу подправить матчер. К примеру, чтобы точки одного изображения всегда имели большее значение по X чем другого.

А зачем вы используете FlannBased матчер, а не BruteForce?

Share this post


Link to post
Share on other sites

Сложный вопрос.

Что в примерах было то и взял.

Сейчас делаю так (фильтр по примерно одинаковой высоте точек):

	for(int i = 0; i < matchSize; ++i)
	{
		float dx = keypoints1[matches[i].queryIdx].pt.x - keypoints2[matches[i].trainIdx].pt.x;
		float dy = keypoints1[matches[i].queryIdx].pt.y - keypoints2[matches[i].trainIdx].pt.y;

		if( (fabs(dy) > imgCol1.rows/10) )
		{
			Point2f t = keypoints2[matches[i].trainIdx].pt;
			t.x += imgCol1.cols;

			cv::circle(summIm,  keypoints1[matches[i].queryIdx].pt, 3, CV_RGB(0, 0, 255), 1);
			cv::circle(summIm, t, 3, CV_RGB(0, 255, 0), 1);
			cv::line(summIm, keypoints1[matches[i].queryIdx].pt, t, CV_RGB(0, 64, 64));

			printf("%d: dx = %.1f, dy = %.1f\r\n", i,	keypoints1[matches[i].queryIdx].pt.x - keypoints2[matches[i].trainIdx].pt.x,
				keypoints1[matches[i].queryIdx].pt.y - keypoints2[matches[i].trainIdx].pt.y); 
		}
	}

 

11 час назад, BeS сказал:

FlannBased матчер, а не BruteForce?

Не очень разбираюсь в отличиях.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×