私は較正されたカメラ(固有の行列と歪み係数)を持っていて、画像内のいくつかの3d点と対応する点(2d点)を知っています。世界座標でのカメラの位置をcv :: solvePnPから
私はcv::solvePnP
が私を助けることができることを知っている、とthisとthisを読んだ後、私はsolvePnP rvec
とtvec
のI出力は、カメラ座標系でのオブジェクトの回転と平行移動していることを理解しています。
ワールド座標系でカメラの回転/平行移動を調べる必要があります。それ上記のリンクから
は、コードは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)
私は(私はC++を使用しています)のpython/numpyの低いものを知らないが、これは、多くのことはありません。私にセンス:
- はrvec、solvePnPからtvec出力は3×1行列であり、3つの要素ベクトル
- cv2.Rodrigues(rvec)は3×3行列である
- cv2.Rodrigues(rvec)[0]であります3×1行列、 3要素ベクトル
- cameraPositionは、3x3行列である3x1 * 1x3行列乗算です。 openglで簡単に
glTranslatef
とglRotate
を呼び出してどうすればいいですか?
はうまくいくようですが、私はglRotatefの角度を次の式から取っています。http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm放射状度から度しかし、私はOpenGLでそれらの値を差し込む場合、私はまだOpenCVのおよびOpenGLでのカメラフレームが異なることに起因することができ、少し間違った翻訳.. – nkint
(回転Xが45°間違ったようなものです)間違ったカメラの回転を取得。私の拡張答えをチェックしてください。 – ChronoTrigger
はい私は、opencvとopenglの間のメモリ内の行列の順序の違いを知っています。そして、y軸とz軸を反転させなければなりません(=> opencv yをopengl zとして使用し、opencv zをOpenGL yとして使用してください) – nkint