OpenCV相机标定与3D重建(14)用于组合两个旋转和平移(R|T)变换函数composeRT()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::composeRT 是 OpenCV 库中的一个函数,用于组合两个旋转和平移(R|T)变换。这个函数可以将两个连续的刚体变换组合成一个单一的变换,这对于多视图几何、相机姿态估计等任务非常重要。此外,该函数还可以计算组合变换相对于原始变换的导数,这对某些优化和误差分析任务非常有用。
函数原型
void cv::composeRT
(InputArray rvec1,InputArray tvec1,InputArray rvec2,InputArray tvec2,OutputArray rvec3,OutputArray tvec3,OutputArray dr3dr1 = noArray(),OutputArray dr3dt1 = noArray(),OutputArray dr3dr2 = noArray(),OutputArray dr3dt2 = noArray(),OutputArray dt3dr1 = noArray(),OutputArray dt3dt1 = noArray(),OutputArray dt3dr2 = noArray(),OutputArray dt3dt2 = noArray()
)
参数
- 参数InputArray rvec1: 第一个旋转向量(Rodrigues 形式),表示从第一个坐标系到第二个坐标系的旋转。
- 参数InputArray tvec1: 第一个平移向量,表示从第一个坐标系到第二个坐标系的平移。
- 参数InputArray rvec2: 第二个旋转向量(Rodrigues 形式),表示从第二个坐标系到第三个坐标系的旋转。
- 参数InputArray tvec2: 第二个平移向量,表示从第二个坐标系到第三个坐标系的平移。
- 参数OutputArray rvec3: 输出的旋转向量(Rodrigues 形式),表示从第一个坐标系直接到第三个坐标系的旋转。
- 参数OutputArray tvec3: 输出的平移向量,表示从第一个坐标系直接到第三个坐标系的平移。
- 参数OutputArray dr3dr1, OutputArray dr3dt1, OutputArray dr3dr2, OutputArray dr3dt2, OutputArray dt3dr1, OutputArray dt3dt1, OutputArray dt3dr2, OutputArray dt3dt2: 这些是可选输出参数,表示组合变换对各个输入变换的偏导数矩阵。如果你不需要这些导数,可以使用 noArray() 来忽略它们。
这些函数计算:
rvec3 = r o d r i g u e s − 1 ( r o d r i g u e s ( rvec2 ) ⋅ r o d r i g u e s ( rvec1 ) ) tvec3 = r o d r i g u e s ( rvec2 ) ⋅ tvec1 + tvec2 , \begin{array}{l} \texttt{rvec3} = \mathrm{rodrigues} ^{-1} \left ( \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \mathrm{rodrigues} ( \texttt{rvec1} ) \right ) \\ \texttt{tvec3} = \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \texttt{tvec1} + \texttt{tvec2} \end{array} , rvec3=rodrigues−1(rodrigues(rvec2)⋅rodrigues(rvec1))tvec3=rodrigues(rvec2)⋅tvec1+tvec2,
其中 rodrigues 表示从旋转向量到旋转矩阵的变换,而 rodrigues^{-1} 表示逆变换。详情请参阅 Rodrigues 函数。
此外,这些函数还可以计算输出向量相对于输入向量的导数(参见 matMulDeriv)。这些函数在 stereoCalibrate 内部使用,但也可以用于你自己的代码中,在那里 Levenberg-Marquardt 或其他基于梯度的求解器用于优化包含矩阵乘法的函数。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{// 假设的旋转向量和平移向量 (rvec1, tvec1) 和 (rvec2, tvec2)Vec3d rvec1 = Vec3d( 0.1, 0.2, 0.3 ); // 第一个旋转向量Vec3d tvec1 = Vec3d( 1.0, 2.0, 3.0 ); // 第一个平移向量Vec3d rvec2 = Vec3d( -0.1, -0.2, -0.3 ); // 第二个旋转向量Vec3d tvec2 = Vec3d( -1.0, -2.0, -3.0 ); // 第二个平移向量// 组合后的旋转向量和平移向量Vec3d rvec3, tvec3;// 调用 composeRT 函数composeRT( rvec1, tvec1, rvec2, tvec2, rvec3, tvec3 );// 打印结果cout << "Combined rotation vector: " << rvec3 << endl;cout << "Combined translation vector: " << tvec3 << endl;return 0;
}
运行结果
Combined rotation vector: [0, 0, 0]
Combined translation vector: [-3.33067e-16, 0, 0]