Цель этого проекта — найти положение камеры с помощьюsolvePnP и сравнить его с реальной камерой. положение (как мы его храним).
Проект (OpenGL) заключается в следующем:
- Создание трехмерного мира (с использованием треугольников), представляющий собой карту высот некоторой фотографии.
- Путешествуйте по этому миру.
- В определенной сцене по вашему выбору выберите 6 3D-точки и рассчитайте соответствующие им 2D-точки.
- Вычислите, где находилась камера, когда вы выбрали эти точки.
- Сравните положение камеры изsolvePnP и истинное положение камеры.
- Существует только 1 вид OpenGL, разделены на две части, так что левая сторона – это общий вид, а правая – вид с камеры.
- Мы используем выбор цвета, чтобы сопоставить треугольники (центральную точку) и уникальный идентификатор (цвет).
- Наш выбор цвета работает отлично.
- Мы изо всех сил пытаемся найти местоположение камеры с помощьюsolvePnP. (Этап 4)
- Выбор 6 точек в сцена:
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
Код: Выделить всё
int framebufferWidth, framebufferHeight;
glfwGetFramebufferSize(window, &framebufferWidth, &framebufferHeight);
int windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
int pixelX = static_cast(xpos * framebufferWidth / windowWidth);
int pixelY = framebufferHeight - static_cast(ypos * framebufferHeight / windowHeight) - 1;
// Only process picking if the click is on the right half of the screen
if (pixelX >= framebufferWidth / 2)
{
// Adjust pixelX to be relative to the right viewport
pixelX -= framebufferWidth / 2;
//find the color of the pixel, and retrieve the ID.
//with this ID, find the matching triangle
//if found :
imagePoints.push_back(glm::vec2(pixelX, pixelY));
objectPoints.push_back(point);
}
- Пытаемся вычислить с помощьюsolvePnP:
void ComputeCameraPose(GLFWwindow* window)
{
if (imagePoints.size() < 4 || objectPoints.size() < 4) {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/787 ... g-solvepnp
Мобильная версия