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

Recommended Posts

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

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

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

Нечто вроде

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

 

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


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

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

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

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


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

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

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

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

 

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

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


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

Сделал

 

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

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

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

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


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

Сделал:

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

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

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


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

На всякий случай сделайте проверку CV_Assert(m.type() == 64FC1);

  • Like 1

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


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

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

Но наверное каждая новая строка должна начинаться с    *(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));

 

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


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

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

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

Вот это:

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

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

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

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
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?

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


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

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

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

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

	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?

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×