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 然后再也不使用它是巧合吗?另外,您使用矩阵点的值创建一个标量对象,然后使用该标量设置点的值?也许这是您错误的根源。

于 2012-07-29T15:35:20.933 回答