使用旋转矩阵opencv

时间:2012-07-28 20:00:45

标签: opencv matrix rotation

我有一个来自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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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的内容)。您可以查看这些值并自行进行乘法,以便仔细检查您是否喜欢。这个过程应该是完全透明的。

答案 1 :(得分:0)

在您的代码中,您定义点p然后再也不使用它是巧合吗?另外,您使用Matrix点的值创建标量对象,然后使用该标量设置点的值?也许这是你错误的根源。