2D полигон для 3D объекта и сцены

Допустим, у вас есть камера и сделайте снимок прямоугольной бумаги, лежащей на столе. Мы получаем эту картинку, используем в качестве плоского фона и должны настроить сцену OpenGL таким образом, чтобы бумага отображалась с квадратом с координатами, скажем, (0,0,0) (1,0,0) (1).,2,0) (0,2,0) с определенной камерой и настройками просмотра.

Другими словами, нам нужно воспроизвести те же алгоритмы, что и в функции "точки схода" фотошопа.

Для математического решения задачи необходимо определенно определить еще несколько констант, чтобы дать одно решение (расстояние от наблюдателя и т. Д.). Не должно быть проблем с исправлением этих данных во время сборки.

Было бы желательно получить математическое решение, но лучше рабочий код C/C++ со ссылкой на любую внешнюю математическую среду для геометрических преобразований и т. Д. Для ввода согласованных данных в параметры модели камеры OpenGL.

И NyArToolkit, и OpenCV имеют интересные и сложные функции, но входные данные относятся к "обучению", которое не требуется. Функция Photoshop "Точка исчезновения" работает в режиме реального времени, давая результат только с 4 2d точками ввода.

Функция нам нужна что-то вроде

BOOL calculate_3D_scene_From_2D_Rectangle(
       point2d* pointsList, // in: array of the four corners of the quad rectangle
                            // in 2d coordinates, in clockwise order
       rect2d   sceneSize,  // in: view area in 2d coordinates, points are contained
                            // within this area
       float    eyeDistance // in: distance from observer eye to the object
       point3d* vertexList  // out: four coordinates of the point in 3d space
       float*   mvMatrix    // out: 4x4 matrix to use as model view matrix in openGl
                            // return: true if found a correct result
);

Пример очевидного использования

point2d pointsList[] = { { -5, -5 }, { 10, -5 }, { 10, 10 }, { -5, 10 } };
rect2d sceneSize = { -20,-20,20,20 };
float eyeDistance = 20;

point3d vertexList[4];
float mvMatrix[16];

calculate_3D_scene_From_2D_Rectangle(
    pointsList,sceneSize,eyeDistance,vertexList,mvMatrix);

[...]
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrixf(mvMatrix);
[...]
draw the polygon with vertexList[0..3];
[...]

Любая действительно применимая реализация для правильного Calculate_3D_scene_From_2D_Rectangle() будет принята с благодарностью.

2 ответа

Это звучит как калибровка камеры, обычная задача в компьютерном зрении. OpenCV предлагает функции для этого:

http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html

Взглянуть на findhomography. этого уже может быть достаточно для вашей задачи. Если вы хотите выполнить полную калибровку камеры, вам нужно более 4 баллов (минимум 6), но для плоских отображений гомографический подход работает отлично.

Другие вопросы по тегам