私はAugmented Realityアプリケーションを作成するために、 "OpenCV for Unity3d"アセットを使用しています(これはJava用の同じOpenCVパッケージですが、Unity3d用にはC#私の修士論文(コンピュータサイエンス)。Unity3Dで3Dオブジェクトを配置するためのOpenCV rotation(Rodrigues)と翻訳ベクトル
これまでのところ、ORB機能検出器を使用してビデオフレームからオブジェクトを検出することができました。また、OpenCVのSolvePnPメソッド(私はカメラキャリブレーションも行っていました)を使用して3D対2Dの関係を見つけることができます。 その方法から、私は翻訳と回転ベクトルを得ています。この問題は、仮想オブジェクトとして3Dオブジェクトを表示し、各フレームでその位置と回転を更新する必要がある拡張段階で発生します。 OpenCVはRodrigues Rotationマトリックスを返しますが、Unity3dはQuaternionローテーションで動作しますので、オブジェクトの位置と回転を間違って更新しています(RodriguesからQuaternionへの変換フォーラムを実装する方法を理解できません)。
rvecとtvec行き方:
Mat rvec = new Mat();
Mat tvec = new Mat();
Mat rotationMatrix = new Mat();
Calib3d.solvePnP (object_world_corners, scene_flat_corners, CalibrationMatrix, DistortionCoefficientsMatrix, rvec, tvec);
Calib3d.Rodrigues (rvec, rotationMatrix);
仮想物体の位置更新:あなたはUnty3dのシステムにOpenCVの者を変換する際に座標ので、私はZ軸のマイナス符号を持つ
Vector3 objPosition = new Vector3();
objPosition.x = (model.transform.position.x + (float)tvec.get (0, 0)[0]);
objPosition.y = (model.transform.position.y + (float)tvec.get (1, 0)[0]);
objPosition.z = (model.transform.position.z - (float)tvec.get (2, 0)[0]);
model.transform.position = objPosition;
をZ軸を反転する必要があります(自分でシステム座標をチェックしました)。
Unity3dの座標系(緑は赤がXであるとブルーがZで、Yです):
のOpenCVの座標系:また
私は同じことをしました私は仮想オブジェクトの回転を更新しました。
p.s私は同様の質問を見つけましたが、解決策を明確に投稿していない人がいました。
ありがとうございます!
今、すべて意味があります:)私の翻訳ベクトルは間違っていると思います。 3Dオブジェクトはシーン内で間違って動いています!私が間違っているのは何ですか? – user43053534
位置については、方向ベクトルの場合と同じようにY座標を反転します。 Z軸は一般に画像中心を通らないカメラの光軸です。キャリブレーションパラメータには、CxおよびCyパラメータがあります。これらは、カメラの光軸(Z軸)が画像内を通過する画像中心からの画像空間における2Dオフセットである。 3DアプリケーションをARアプリケーション用に2Dの背景にマッピングすることは本当に重要です! – RCYR
これを正しく動作させるためには、どのような変更を行う必要がありますか?カメラのキャリブレーションの後、私はカメラの内在的なパラメータを得ました。 virutalオブジェクトを正しく配置するために、それらをどのように使用しなければなりませんか? – user43053534