当前位置: 首页 > news >正文

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=rodrigues1(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]

http://www.mrgr.cn/news/79734.html

相关文章:

  • Linux 简单命令总结
  • Simdroid-EC:液冷仿真新星,助力新能源汽车电机控制器高效散热
  • k8s service 配置AWS nlb load_balancing.cross_zone.enabled
  • 燃气轮机燃烧室:氢气燃烧
  • 深入解析下oracle的number底层存储格式
  • ChatGPT Pro是什么
  • 5G中的随机接入过程可以不用收RAR?
  • UE4 骨骼网格体合并及规范
  • 【伪代码】数据结构-期末复习 线性表
  • 【git】git回退到之前版本+拓展git命令
  • TCP/IP杂记
  • 本地搭建MQTT服务器
  • Onedrive技巧与问题
  • v-for遍历多个el-popover;el-popover通过visible控制显隐;点击其他隐藏el-popover
  • 【实操GPT-SoVits】声音克隆模型图文版教程
  • Python爬虫之urllib库使用总结
  • Mac软件推荐
  • maxscript中BoundingBox求一个模型的高度
  • C#-WPF 常见类型转换方法(持续更新)
  • 5G Multi-TRP R16~R18演进历程
  • Linux网络基础知识————网络编程
  • rk3588-ubuntu22.04系统网关实现路由器功能:
  • 《Hadoop大数据技术应用综合训练》----以NBA冠军球队计数为例
  • C# .NET CORE 开发问题汇总
  • day10 电商系统后台API——接口测试(使用postman)
  • 【Spark】Spark Join类型及Join实现方式