使用旋转矩阵opencv
我有一个来自函数Core.Rodrigues的旋转矩阵。我想通过此旋转矩阵围绕原点旋转位于(0,0,1)处的点。如何获取点的新位置使用旋转矩阵opencv,opencv,matrix,rotation,Opencv,Matrix,Rotation,我有一个来自函数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
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,当我知道这是错误的时候
如果有任何帮助,我们将不胜感激。在您的代码中,您定义了p点,然后再也不使用它,这是巧合吗?另外,是否使用矩阵点的值创建标量对象,然后使用该标量设置点的值?这可能是错误的根源。围绕原点旋转点的方法是将其与旋转矩阵预乘。我不熟悉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_矩阵中的值,确保它们被初始化为合理的值(Matx的内容可以在调试器中看到)。如果愿意,您可以查看这些值并自己进行乘法以进行双重检查。这个过程应该是完全透明的 不,在写这篇文章时,我更改了变量名,以便读者更容易理解,我只是犯了一个错误。实际代码现在与上面读取的代码相同。对不起,弄错了。