Khludenkov 1 Report post Posted 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); Share this post Link to post Share on other sites
mrgloom 242 Report post Posted July 8, 2016 http://math.stackexchange.com/questions/78137/decomposition-of-a-nonsquare-affine-matrix 1 Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted July 11, 2016 Спасибо. А в opencv доступ к элементам матрицы такой же? Построчно? Везде матрицы для изображений приводятся... Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted July 11, 2016 Я к тому что в документации не указано, в каком виде представлена матрица гомографии. То ли это 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
Khludenkov 1 Report post Posted July 11, 2016 Что-то вроде А = H[2][1]; Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted July 11, 2016 Сделал printf("size = %d\r\n", H.elemSize()); На 32-х битном ХР выдаёт 8 (байт?). Это тип dоuble значит? Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted July 11, 2016 Сделал: 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
mrgloom 242 Report post Posted July 11, 2016 На всякий случай сделайте проверку CV_Assert(m.type() == 64FC1); 1 Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted 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)); Share this post Link to post Share on other sites
mrgloom 242 Report post Posted July 11, 2016 Доступ к 2D матрице H.at<double>(y,x) 1 Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted July 11, 2016 А может ещё с матчингом поможете? Выходные параметры не совсем ясны. Вот это: FlannBasedMatcher matcher; std::vector< DMatch > matches; matcher.match( descriptors_object, descriptors_scene, matches ); И исходные коды его в сорсах не нашёл. Я хочу подправить матчер. К примеру, чтобы точки одного изображения всегда имели большее значение по X чем другого. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted July 11, 2016 Видимо можно пофильтровать по какому либо критерию найденные особые точки до вычисления дескрипторов и матчинга. Share this post Link to post Share on other sites
BeS 53 Report post Posted 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? Share this post Link to post Share on other sites
Khludenkov 1 Report post Posted 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? Не очень разбираюсь в отличиях. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted July 13, 2016 Как не странно BruteForce может быть быстрее. Share this post Link to post Share on other sites