Использование координат пикселей OpenCV в OpenGL для рисования квадрата

#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 находится в ортографическом режиме, и ваш квадрат остается квадратом, а не ромб.