У меня есть откалиброванная камера (внутренняя матрица и коэффициенты искажения), и я хочу знать положение камеры, зная некоторые 3D-точки и их соответствующие точки на изображении (2d точек).Позиция камеры в мировой координате из cv :: solvePnP
Я знаю, что cv::solvePnP
может помочь мне, и после прочтения this и this Я понимаю, что выходы 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 питания (я использую C++), но это не делает много смысл мне:
- rvec, выход tvec из solvePnP являются 3x1 матрицы, 3 элемента векторов
- cv2.Rodrigues (rvec) представляет собой матрицу 3х3
- cv2.Rodrigues (rvec) [0] является 3x1, 3 вектора элемента
- cameraPosition - матричное умножение 3x1 * 1x3, которое является матрицей .. 3x3. как я могу использовать это в opengl с простыми
glTranslatef
иglRotate
звонками?
, похоже, работает, я получаю углы для 'glRotatef' с формулой, взятой из этого: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm, а затем нормальное преобразование из радиальные до степени. Но если я подключу эти значения в opengl, я все равно получаю неправильное вращение камеры (вращение X - это что-то вроде 45 ° неправильно) и немного неправильный перевод. – nkint
Это может быть связано с тем, что рамка камеры в OpenCV и OpenGL различна , Проверьте мой расширенный ответ. – ChronoTrigger
Да, я знаю разницу в порядке матрицы в памяти между opencv и opengl. И мне также нужно перевернуть оси y и z (=> использовать opencv y как opengl z и использовать opencv z как opengl y) – nkint