2016-09-08 6 views
0

Я видел, что многие люди спрашивают подобные вопросы, но я не могу точно соответствовать любой ответ на мою проблемуOpenCV - получить 3D-координаты из 2D

У меня есть маркер и я (х, у) из него в координаты изображения. Я могу получить матрицу преобразования и матрицу вращения. Теперь, как я могу получить координаты (x, y, z)?

(если кто-нибудь может посоветовать мне, как решить мою проблему или перенаправить, я был бы благодарен).

EDIT: Я использую Альвар библиотеку, где я получаю координаты маркера, и я могу получить также создают из него (так что я должен также вращение матрицы 3x3, и перевод матрицы 3x4 или 4x4)

EDIT 2: Я искал больше, и я изучаю метод, который позволяет мне получить матрицы вращения и трансляции. Ну, я предположил, что я могу получить две матрицы, зависит от входных аргументов. Но если я установить в качестве матрицы аргумент 3х3 I будет иметь матрицу вращения только, но если я ставлю там 3x4 или 4x4 матрицы я получаю:

  • для 4x4
    | r0 r1 r2 t1 |
    | r3 r4 r5 t2 |
    | r6 r7 r8 t3 |
    | 0 0 0 1 |

  • для 3x4
    | r0 r1 r2 t1 |
    | r3 r4 r5 t2 |
    | r6 r7 r8 t3 |

+0

умножьте свою точку объекта от solvePnP с составом преобразования вращения и перевода ... – Micka

+0

Хорошо, я понимаю, но понимаю, но я хочу быть уверенным. Я не использую solvePnP. Я получаю (x, y), используя другую библиотеку. У меня есть координаты (x, y) в координатах изображения (в пикселях). Затем я должен умножить эту точку на инвертированную матрицу вращения. И тогда я должен вычесть: R^-1 * t. Если я думаю, что мои исходные координаты должны быть в однородных координатах? Я прав? –

+0

Не превращайте точку, преобразуйте базовые 3D-точки объекта (например, центр тяжести). Может быть, мы говорим о разных вещах, вы можете сказать в своем вопросе, что у вас есть, и какую ротацию и перевод вы имеете в виду и как вы их вычислили? – Micka

ответ

4

Скажет у вас есть точка изображения в блоке пикселей на плоскости изображения: cv::Vec2d imagePoint(u, v);

Прежде всего, вы должны преобразовать эту точку в системе координат камеры. Если предположить, что параметры Intrinsics (матричные камеры и искажения линзы коэффициенты) вашей камеры, как известно, можно вычислить идеальные (u', v') координаты вашего наблюдаемого imagePoint:

u'' = (u - cx)/fx 
v'' = (v - cy)/fy 
(u', v') = undistort(u'', v'', distCoeffs) 

Где cx и cy координаты основных точек, которые обычно вокруг центра изображения, кроме того, fx и fy являются фокусными расстояниями в пиксельных единицах (вы можете получить их из матрицы камеры). И distCoeffs содержит коэффициенты радиального/тангенциального искажения, которые также являются результатами cv::calibrateCamera(...).

Во всяком случае, вы не должны вычислять (u', v') вручную, потому что cv::undistortPoints(...) делает это путем вызова функции с отсутствием или по умолчанию R и P параметров.

Точка imagePoint в камере системы координат заключается в следующем:

std::vector<cv::Vec2d> imagePts; 
std::vector<cv::Vec2d> idealPts; 
imagePts.push_back(imagePoint); 

cv::undistortPoints(imagePts, idealPts, cameraMatrix, distCoeffs); 

const double lambda = 1.0; 
cv::Mat cameraPt(3, 1, CV_64F); 
cameraPt.at<double>(0) = idealPts[0][0] * lambda; 
cameraPt.at<double>(1) = idealPts[1][1] * lambda; 
cameraPt.at<double>(2) = lambda; 

На данный момент, вам нужна камера для мировой матрицы преобразования выразить cameraPt в мире система координат:

cv::Mat camToWorld = cv::Mat::eye(4, 4, CV_64FC1); 
// Fill camToWorld with [R^T|-R^T*t] 
// ... 

cameraPt.push_back(1.0); 
cv::Mat worldPt = camToWorld * cameraPt; 

До сих пор worldPt определяет луч в мировой системе координат, соответствующий imagePoint.То есть каждая точка луча/линии может быть проецирована на тот же номер imagePoint, поэтому у вас есть бесконечное количество точек в мире, которые принадлежат к одному и тому же imagePoint. Но, например, с помощью алгоритма пересечения лучей треугольника Möller-Trumbore вы можете определить одну трехмерную точку на плоскости мира.

+0

Являются ли коэффициенты worldPt уравнения линии? Я не уверен, правильно ли я это понял. Какова была бы трехмерная точка в плоскости z = 0? – harsh

Смежные вопросы