Tôi có camera hiệu chỉnh (ma trận nội tại và hệ số méo) và tôi muốn biết vị trí camera biết một số điểm 3d và điểm tương ứng của chúng trong ảnh (2d điểm).Vị trí camera trong phối hợp thế giới từ cv :: resolvePnP
Tôi biết rằng cv::solvePnP
có thể giúp tôi, và sau khi đọc this và this Tôi hiểu rằng tôi các kết quả đầu ra của solvePnP rvec
và tvec
là luân chuyển và bản dịch của các đối tượng trong máy ảnh hệ tọa độ.
Vì vậy, tôi cần tìm hiểu về xoay/dịch của máy ảnh trong hệ tọa độ thế giới.
Từ liên kết ở trên có vẻ như rằng mã rất đơn giản, trong 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)
Tôi không biết python/chất liệu NumPy (Tôi đang sử dụng C++) nhưng điều này không kiếm được nhiều ý nghĩa với tôi:
- rvec, sản lượng tvec từ solvePnP là ma trận 3x1, 3 yếu tố vector
- cv2.Rodrigues (rvec) là một ma trận 3x3
- cv2.Rodrigues (rvec) [0] là một Ma trận 3x1, 3 phần tử vectơ
- cameraĐặt vị trí là phép nhân ma trận 3x1 * 1x3 là ma trận .. 3x3. làm thế nào tôi có thể sử dụng điều này trong opengl với các cuộc gọi
glTranslatef
vàglRotate
đơn giản?
dường như hoạt động, tôi nhận được các góc cho 'glRotatef' với công thức được lấy từ đây: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm và sau đó chuyển đổi bình thường từ radials đến mức độ. Nhưng nếu tôi cắm các giá trị đó vào trong opengl thì tôi vẫn quay nhầm (xoay X là 45 ° sai) và dịch sai một chút. – nkint
Điều đó có thể là do khung máy ảnh trong OpenCV và OpenGL khác nhau . Kiểm tra câu trả lời mở rộng của tôi. – ChronoTrigger
vâng tôi biết sự khác biệt về thứ tự ma trận trong bộ nhớ giữa opencv và opengl. Và tôi cũng phải lật trục y và z (=> sử dụng opencv y như opengl z và sử dụng opencv z làm opengl y) – nkint