2

opencvの関数Core.Rodriguesからの回転行列があります。この回転行列によって、原点を中心に(0、0、1)にある点を回転させたい。ポイントの新しい場所を取得するにはどうすればよいですか?

   Mat rmat= new Mat();
   Calib3d.Rodrigues(rvec, rmat); //rvec is the rotation vector from solvepnp
   double[] p= {0, 0, 1};
   Scalar scalar= new Scalar(p);
   Mat point= new Mat(1, 3, CvType.CV_64F, scalar);
   Mat newpoint= new Mat();
   Mat empty= new Mat();
   Core.gemm(point, rmat, 1, empty, 0, newpoint);

newpointの結果は0、0、0ですが、それが間違っていることがわかっている場合

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

原点を中心に点を回転させる方法は、それを回転行列で事前に乗算することです。Core.gemmに精通していません。これを行うためのより透過的な方法は次のとおりです。

Mat rmat= new Mat();
Calib3d.Rodrigues(rvec, rmat); //rvec is the rotation vector from solvepnp
Matx33f rotation_matrix = rmat;
Matx31f original_point(0,0,1);
Matx31f rotated_point = rotation_matrix*original_point;

これはデバッグがはるかに簡単なはずです。rotation_matrixに格納されている値をチェックし、それらが適切な値に初期化されていることを確認します(Matxの内容はデバッガーで確認できます)。値を確認し、必要に応じて自分で乗算を行って再確認することができます。プロセスは完全に透過的である必要があります。

于 2012-07-30T16:10:16.463 に答える
0

あなたのコードで、あなたがあなたのポイントpを定義し、それからそれを二度と使用しないのは偶然ですか?また、Matrixポイントの値を使用してScalarオブジェクトを作成し、そのスカラーを使用してポイントの値を設定しますか?おそらく、これがエラーの原因です。

于 2012-07-29T15:35:20.933 に答える