저는 보정 된 카메라 (고유 행렬 및 왜곡 계수)를 가지고 있으며 이미지의 일부 3d 점과 해당 점 (2d 점)을 알고있는 카메라 위치를 알고 싶습니다.세계 좌표계에서 카메라의 위치는 cv :: solvePnP에서
나는 cv::solvePnP
가 나를 도울 수 있다는 것을 알고, this 및 this을 읽은 후 나는 solvePnP rvec
및 tvec
의 I 출력이 회전 카메라에서 개체의 번역 좌표계 것으로 알고 있습니다.
그래서 세계 좌표계에서 카메라 회전/평행 이동을 찾아야합니다.
이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)
내가 파이썬/NumPy와 거즈를 모르는 (나는 C를 사용하고 있습니다 ++) 그러나 이것은 많이하지 않습니다 : 링크에서
는 코드가 Python으로, 간단 것으로 보인다 위 그다지 의미 :
- rvec, solvePnP에서 tvec 출력은 3 × 1 행렬이고, 3 요소 벡터
- cv2.Rodrigues (rvec)는 3 × 3 행렬
- cv2.Rodrigues (rvec) [0]이다 3x1 매트릭스, 3 요소 벡터
- cameraPosition은 3x1 행렬 인 3x1 * 1x3 행렬 곱셈입니다. 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