Khludenkov 1 Жалоба Опубликовано July 8, 2016 Здравствуйте. Скажите, в каком виде внутри opencv представляется матрица гомографии? Есть ли функции для того, что получить из неё вращение, сдвиг, растяжение? Нечто вроде float dy = get_dy_from_Homography(H); float dx = get_dx_from_Homography(H); float angle = get_angle_from_Homography(H); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 8, 2016 http://math.stackexchange.com/questions/78137/decomposition-of-a-nonsquare-affine-matrix 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Спасибо. А в opencv доступ к элементам матрицы такой же? Построчно? Везде матрицы для изображений приводятся... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Я к тому что в документации не указано, в каком виде представлена матрица гомографии. То ли это float, то ли ещё что. Честно смотрел http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=findhomography То есть каким образом вытащить значения элементов этой матрицы? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Что-то вроде А = H[2][1]; Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Сделал printf("size = %d\r\n", H.elemSize()); На 32-х битном ХР выдаёт 8 (байт?). Это тип dоuble значит? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Сделал: for (int i = 0; i < 9; ++i) { printf("el = %lf\r\n", H.at<double>(i)); } И результаты похожие: последний элемент = 1. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 11, 2016 На всякий случай сделайте проверку CV_Assert(m.type() == 64FC1); 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 Спасибо. Сделал. Но наверное каждая новая строка должна начинаться с *(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)); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 11, 2016 Доступ к 2D матрице H.at<double>(y,x) 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 11, 2016 А может ещё с матчингом поможете? Выходные параметры не совсем ясны. Вот это: FlannBasedMatcher matcher; std::vector< DMatch > matches; matcher.match( descriptors_object, descriptors_scene, matches ); И исходные коды его в сорсах не нашёл. Я хочу подправить матчер. К примеру, чтобы точки одного изображения всегда имели большее значение по X чем другого. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 11, 2016 Видимо можно пофильтровать по какому либо критерию найденные особые точки до вычисления дескрипторов и матчинга. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано July 12, 2016 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? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Khludenkov 1 Жалоба Опубликовано July 13, 2016 Сложный вопрос. Что в примерах было то и взял. Сейчас делаю так (фильтр по примерно одинаковой высоте точек): 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? Не очень разбираюсь в отличиях. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 13, 2016 Как не странно BruteForce может быть быстрее. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах