opencv Rodrigues()函数

说明

opencv Rodrigues()函数_第1张图片       将旋转矩阵转换为旋转向量,反之亦然。 处理三维旋转问题时,通常采用旋转矩阵的方式来描述。一个向量乘以旋转矩阵等价于向量以某种方式进行旋转。除采用旋转矩阵描述外,还可以用旋转向量来描述旋转,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。旋转向量与旋转矩阵可以通过罗德里格斯(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]

opencv Rodrigues()函数_第2张图片

你可能感兴趣的:(【OpenCV】,opencv,计算机视觉)