Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用旋转矩阵opencv_Opencv_Matrix_Rotation - Fatal编程技术网

使用旋转矩阵opencv

使用旋转矩阵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

我有一个来自函数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,当我知道这是错误的时候


如果有任何帮助,我们将不胜感激。

在您的代码中,您定义了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的内容可以在调试器中看到)。如果愿意,您可以查看这些值并自己进行乘法以进行双重检查。这个过程应该是完全透明的

不,在写这篇文章时,我更改了变量名,以便读者更容易理解,我只是犯了一个错误。实际代码现在与上面读取的代码相同。对不起,弄错了。