2012-07-28 191 views
2

我有一个从函数Core.Rodrigues在opencv旋转矩阵。我想通过这个旋转矩阵来旋转位于(0,0,1)处围绕原点的点。我如何做到这一点,以获得重点的新位置?使用旋转矩阵opencv

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,当我知道这是错误的

任何帮助,将不胜感激。

回答

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的内容可在调试器中看到)。您可以查看这些值并自己进行乘法运算以仔细检查您是否喜欢。这个过程应该完全透明。

0

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

+0

不,在写这篇文章时,我改变了变量名,使读者更容易理解,并且我犯了一个错误。实际的代码现在与上面的代码相同。对不起,这个错误。 – Isaac 2012-07-29 20:56:08