У меня есть откалиброванная камера (внутренняя матрица и коэффициенты искажения), и я хочу знать положение камеры, зная некоторые 3D-точки и их соответствующие точки на изображении (2d точек).
Я знаю, что cv::solvePnP
может мне помочь, и после прочтения этого и этого я понимаю, что я выходы solvePnP rvec
и tvec
- это вращение и перевод объекта в систему координат камеры.
Поэтому мне нужно выяснить вращение/трансляцию камеры в мировой системе координат.
Из приведенных выше ссылок кажется, что код прост, в python:
found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
Я не знаю python/numpy stuffs (я использую С++), но это не имеет для меня большого смысла:
- rvec, вывод tvec из solvePnP - матрица 3x1, 3 вектора элемента
- cv2.Rodrigues(rvec) является матрицей 3x3
- cv2.Rodrigues(rvec) [0] - матрица 3x1, 3 вектора элемента
- cameraPosition - матричное умножение 3x1 * 1x3, которое является матрицей.. 3x3. как я могу использовать это в opengl с простыми вызовами
glTranslatef
иglRotate
?