将旋转矩阵转换为旋转向量,反之亦然。 处理三维旋转问题时,通常采用旋转矩阵的方式来描述。一个向量乘以旋转矩阵等价于向量以某种方式进行旋转。除采用旋转矩阵描述外,还可以用旋转向量来描述旋转,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。旋转向量与旋转矩阵可以通过罗德里格斯(Rodrigues)变换进行转换。
void Rodrigues( InputArray src, OutputArray dst, OutputArray jacobian = noArray() );
参数说明:
src——为输入的旋转向量(3x1或者1x3)或者旋转矩阵(3x3)。该参数向量表示其旋转的角度,用向量长度表示。
dst——为输出的旋转矩阵(3x3)或者旋转向量(3x1或者1x3)。
jacobian——为可选的输出雅可比矩阵(3x9或者9x3),是输入与输出数组的偏导数。
//旋转向量到旋转矩阵
cv::Mat xRotate = (cv::Mat_(3, 1) << CV_PI / 2, 0, 0);
cv::Mat rotateX;
cv::Rodrigues(xRotate, rotateX);
std::cout << "旋转矩阵:" << rotateX << std::endl;
cv::Mat z = (cv::Mat_(3, 1) << 0, 0, 1);
cv::Mat dstX = rotateX * z;
std::cout << "绕x轴正旋转:" << dstX << std::endl;
cv::Mat yRotate = (cv::Mat_(3, 1) << 0, -CV_PI / 2, 0);
cv::Mat rotateY;
cv::Rodrigues(yRotate, rotateY);
std::cout << "旋转矩阵:" << rotateY << std::endl;
cv::Mat y = (cv::Mat_(3, 1) << 0, 0, 1);
cv::Mat dstY = rotateY * y;
std::cout << "绕y轴正旋转:" << dstY << std::endl;
0, 6.123233995736766e-17, -1;
0, 1, 6.123233995736766e-17]
绕x轴正旋转:[0;
-1;
6.123233995736766e-17]
旋转矩阵:[6.123233995736766e-17, 0, -1;
0, 1, 0;
1, 0, 6.123233995736766e-17]
绕y轴正旋转:[-1;
0;
6.123233995736766e-17]
上面代码将z或y轴作为旋转轴,旋转角度为90度。
这里需要使用采用的弧度制CV_PI / 2,而不是90°。
将该旋转向量转化为旋转矩阵,初始向量vec(1,0,0)
旋转矩阵与初始向量相乘应该得到旋转90度后的向量.
计算结果与旋转结果几乎一致,实现了旋转的功能。
cv::Mat r = (cv::Mat_(3, 3) <<
0, -1, 0,
1, 0, 0,
0, 0, 1);
std::cout << "旋转矩阵:" << r << std::endl;
cv::Mat out;
cv::Rodrigues(r, out);
std::cout << "旋转向量:" << out << std::endl;
旋转矩阵:[0, -1, 0;
1, 0, 0;
0, 0, 1]
旋转向量:[0;
0;
1.570796326794897]