Я получаю параметры моей камеры, используя calibrateCamera()
и теперь у меня есть cameraMatrix, distCoeffs, вращение Matrix, transformMatrix.
С помощью этих матриц я могу построить матрицу проекции и преобразовать точки трехмерного объекта в пространстве в точки двумерного изображения.
Что-то вроде этого:
Но то, что я хочу, это обратная проекция. Я хочу преобразовать эти 2D точки обратно в 3D пространство. Я знаю, что потерял некоторую информацию, но все мои исходные пункты были в одном плане.
Пожалуйста, помогите мне построить похожую матрицу, используя параметры камеры для этого преобразования.
Из набора спроецированной 2D-точки вы не можете вернуть исходные 3D-точки, но лучи, которые соединяют 3D-точки и их проекции в плоскости изображения. Таким образом, вы теряете глубину трехмерных точек; это значит, что вы знаете ориентацию, но у вас нет расстояния от камеры до 3D-точек.
Вы должны будете составить глубину трехмерных точек. Их плоское состояние позволяет вам сделать некоторые ограничения в их относительных положениях, но этого недостаточно, чтобы восстановить их исходную глубину.
Например, вы можете установить глубину 3 неколлинеарных точек, чтобы создать плоскость в трехмерном пространстве. Глубина других точек 2D будет определяться пересечением этих лучей с этой новой плоскостью.
Если вы знаете вектор нормали к плоскости, которая создала 3D-точки, вы можете сделать что-то похожее, просто установив глубину одной 2D-точки и вычислив остальные соответственно. Кроме того, только если у вас есть расстояние от этой плоскости до начала координат (до камеры), вы можете получить реальную глубину ваших трехмерных точек.
Других решений пока нет …