#opengl #opencv
#opengl #opencv
Вопрос:
У меня есть массив 2D вершин размером 4×2, сгенерированный OpenCV для квадратного маркера. Я хочу использовать эти координаты в системе координат OpenGL, чтобы нарисовать 2D-квадрат в точном местоположении маркера. Как это сделать?
Вот мой код, как вы можете видеть ниже, 2D-квадрат нарисован меньше, чем маркер.
// 'CvMat* dstPoints2D' is generated using cvProjectPoints2()
glPushMatrix();
glBegin(GL_QUADS);
glVertex2f((float)dstPoints2D->data.fl[2], (float)dstPoints2D->data.fl[3]); // right, bottom
glVertex2f((float)dstPoints2D->data.fl[0], (float)dstPoints2D->data.fl[1]); //Left, bottom
glVertex2f((float)dstPoints2D->data.fl[4], (float)dstPoints2D->data.fl[5]); // left, top
glVertex2f((float)dstPoints2D->data.fl[6], (float)dstPoints2D->data.fl[7]); // right, top
glEnd();
glPopMatrix();
Комментарии:
1. Не могли бы вы опубликовать 4 пары (x, y) для каждого прямоугольника?
2. Я записал эти координаты в случайный момент. Они меняются каждый раз, когда я перемещаю камеру. (x, y) координаты, найденные в dstPoints2D
(50.8629, 95.2119), (42.4225, 199.088), (161.459, 94.3529), (159.245, 197.341)
3. 1 для вашего интереса. Возможно, это проблема с калибровкой камеры (встроенные матрицы с коэффициентом искажения). Мой вопрос заключается в следующем: вышеупомянутая фигура была нарисована с использованием glVertex2f (в 2D-пространстве OpenGL). ** Как использовать матрицы, генерируемые в OpenCV, для рисования 3D-объекта и размещения его в точном местоположении в OpenGL? **
Ответ №1:
Кажется, что у вас другая система координат (CS). Ваши вершины OpenCV являются 2D. Вам нужно сначала откалибровать OpenGL CS, а затем применить коэффициент размера. Вы хотели бы сделать это, используя только 2 точки (точки экстремума одной из ваших сторон квадрата или диагнозы). В противном случае вам понадобится более сложный алгоритм для подгонки с использованием всей имеющейся у вас информации о вершинах (на случай, если ваш квадрат станет чем-то другим, например, ромб).
Самый простой способ — добавить коэффициент преобразования в ваш OpenGL square CS для первой точки коэффициент размера и направление 🙂
Я предполагаю, что ваша сцена OpenGL находится в ортографическом режиме, и ваш квадрат остается квадратом, а не ромб.