首页 > 其他分享 >相机位姿比较

相机位姿比较

时间:2023-05-24 15:24:27浏览次数:48  
标签:Mat cv 相机 Range bmatrix 位姿 范数 比较

单个相机旋转矩阵计算运动范围是否太大

double normofTransform(cv::Mat rvec, cv::Mat tvec)
{
  return fabs(min(cv::norm(rvec), 2*M_PI-cv::norm(rvec)))+fabs(cv::norm(tvec));
}

计算旋转向量和平移向量的范数的函数:
其中,旋转向量用rvec表示,平移向量用tvec表示。
具体的,用cv::norm函数来计算rvectvec的范数,而fabs函数则用于取范数的绝对值。

在计算rvec的范数时,用到了min函数来比较rvec的范数和\(2 \pi\)减去rvec的范数,然后返回二者中的最小值。
这是因为旋转向量在数学上可以表示为一个角度和一个方向,而由于旋转向量的方向无法确定,因此只有在角度小于\(\pi\)时才是唯一的,而当角度大于\(\pi\)时,可以通过旋转向量反向来得到相同的旋转效果。因此,这里需要将大于\(\pi\)的角度对应的旋转向量转换为小于\(\pi\)的角度对应的旋转向量。
最后,将rvec的范数和tvec的范数的绝对值相加,得到最终结果。

\[\left \| \begin{bmatrix} R & t\\ 0 & 1 \end{bmatrix} \right \| = \sqrt{ \left \| \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} R^T & -R^Tt\\ 0 & 1 \end{bmatrix} \right \| } \]

相机位姿的范数可以用于评估相机的位姿精度,通常用于相机姿态估计,相机定位等计算机视觉任务中。
在实际应用中,相机位姿的精度越高,通常对应着更高的任务准确度和鲁棒性,因此,通过计算相机位姿的范数可以对相机姿态估计算法的优劣进行评估和比较。

对两个位姿进行比较

  1. 计算两个位姿之间的欧式距离:可以将两个位姿分别转换未欧拉角或四元数表示,然后计算它们之间的欧式距离。欧式距离越小,表示两个位姿越接近。
  2. 计算两个位姿之间的角度差:可以将两个位姿分别转换为欧拉角或四元数表示,然后计算它们之间的角度差。角度差越小,表示两个位姿越接近。
  3. 计算两个位姿之间的相对误差:可以将两个位姿分别转换为变换矩阵表示,然后计算它们之间的相对误差。相对误差越小,表示两个位姿越接近。

  1. 计算两个位姿之间的欧式距离公式:

\[d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2 } \]

其中,\((x_1,y_1,z_1)和(x_2,y_2,z_2)\)分别表示两个位姿的欧拉角或四元数表示。

C++实现,点击查看代码
double poseDistance(const cv::Mat& pose1, const cv::Mat& pose2)
{
    cv::Mat rvec1, tvec1, rvec2, tvec2;
    cv::Mat R1, R2;
    cv::Rodrigues(pose1(cv::Range(0, 3), cv::Range(0, 3)), R1);
    cv::Rodrigues(pose2(cv::Range(0, 3), cv::Range(0, 3)), R2);
    cv::Rodrigues(R1.t() * R2, rvec1);
    cv::Rodrigues(pose1(cv::Range(0, 3), cv::Range(3, 4)) - R1.t() * R2 * pose2(cv::Range(0, 3), cv::Range(3, 4)), tvec1);
    return cv::norm(tvec1);
}

  1. 计算两个位姿之间的角度差公式:

\[\bigtriangleup \theta = cos^{-1}(q_1^{-1}q_2) \]

其中,\(q_1\)和\(q_2\)分别表示两个位姿的四元数表示。

C++实现,点击查看代码
double poseAngleDiff(const cv::Mat& pose1, const cv::Mat& pose2)
{
    cv::Mat q1, q2;
    cv::Rodrigues(pose1(cv::Range(0, 3), cv::Range(0, 3)), q1);
    cv::Rodrigues(pose2(cv::Range(0, 3), cv::Range(0, 3)), q2);
    double dot_prod = q1.dot(q2);
    double norm_prod = cv::norm(q1) * cv::norm(q2);
    return acos(dot_prod / norm_prod);
}

  1. 计算两个位姿之间的相对误差公式:

\[\epsilon = \left \| \begin{bmatrix} R_1 & t_1\\ 0 & 1 \end{bmatrix}^{-1} \begin{bmatrix} R_2 & t_2 \\ 0 & 1 \end{bmatrix} - \begin{bmatrix} I & 0 \\ 0 & 1 \end{bmatrix} \right \| \]

其中,\(R_1\)和\(t_1\)分别表示第一个位姿的旋转矩阵和平移向量,
\(R_2\)和\(t_2\)分别表示第一个位姿的旋转矩阵和平移向量。

C++实现,点击查看代码
double poseRelativeError(const cv::Mat& pose1, const cv::Mat& pose2)
{
    cv::Mat T1 = cv::Mat::eye(4, 4, CV_64F);
    cv::Mat T2 = cv::Mat::eye(4, 4, CV_64F);
    pose1.copyTo(T1(cv::Range(0, 3), cv::Range(0, 4)));
    pose2.copyTo(T2(cv::Range(0, 3), cv::Range(0, 4)));
    cv::Mat T12 = T1.inv() * T2;
    double error = cv::norm(T12 - cv::Mat::eye(4, 4, CV_64F));
    return error;
}

标签:Mat,cv,相机,Range,bmatrix,位姿,范数,比较
From: https://www.cnblogs.com/Balcher/p/17428227.html

相关文章

  • Cesium将相机定位到指定的位置
    使用Cesium的viewer.camera.flyTo方法将相机定位到指定的位置,并设置相机的方向和倾斜角。viewer.camera.flyTo({//摄像机在WGS84(世界)中的最终位置坐标或从自上而下的视图中可以看到的矩形destination:Cesium.Cartesian3.fromDegrees(113,23,8000.0),//包含方向和......
  • Java比较器
    Java比较器背景:在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种:自然排序:java.lang.Comparable定制排序:java.util.Comparator方式一:自然排序:java.lang.ComparableComparable接口强行对实现它的每个类的对象进行整体排......
  • 记录--使用率比较低的10个Web API
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助avaScript中有些API可能使用率比较低,下面我们逐一介绍它们的用法和使用场景。至于标题,主要是想让你进来看看,兄弟们别打我!BlobAPIBlobAPI用于处理二进制数据,可以方便地将数据转换为Blob对象或从Blob对象读取数......
  • 比较不同Python图形处理库或图像处理库的异同点
    python的图像处理库有很多种比如:pillow库、Numpy库、Scipy库、opencv库、pgmagic库等其中较常用的是NUmapy库、pillow库、openCV库,今天我们就这三种图像处理库来进行比较首先是numapy库;他是一个python库可以帮助我们处理所有类型的科学计算,他是在执行任何数据预处理或数据科......
  • ROS单目相机标定 ------ 亲测
    camera_calibration/Tutorials/MonocularCalibration-ROSWiki说明:本教程介绍使用camera_calibration的cameracalibrator.py节点在ROS上使用原始图像校准单目相机。 1.在开始之前确保您具备以下条件:具有已知尺寸的大型棋盘。本教程使用108毫米正方形的6*4棋盘。校准使用......
  • 【FPGA】Verilog 实践:奇偶校验生成器 | 奇偶校验检查器 | 2-bit 二进制比较器
    写在前面:ParitybitGenerator/Checker和2bitbinarycomparator的了解和确认动作。使用Verilog进行ParitybitGenerator/Checker、2bitbinary,实施comparator,生成输入信号后确认通过模拟器实现的每个Gate操作,通过FPGA验证Verilog实现的电路的行为。Ⅰ.前置知识0x00......
  • 分数比较
    一问题描述输入两个分数比较他们的大小二设计思路将分母换成相同的比较之后的分子的大小三程序流程图 四伪代码实现#include<iostream>usingnamespacestd;intmain(){ intx,y,m,n; cin>>x>>y; cin>>m>>n; if(x*n>m*y){ cout<<m<<"/"<<n<<"<......
  • #yyds干货盘点# LeetCode程序员面试金典:比较版本号
    1.简述:给你两个版本号version1和version2,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个'.'连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此......
  • 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS
    更新一期视频教程:BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)https://www.armbbs.cn/forum.php?mod=viewthread&tid=119189视频版:https://www.bilibili.com/video/BV1zL41167Ti 1、基于开放系统组装协议OSAP实现的简化硬件设......
  • js 手写深比较
     functionisObject(obj){returntypeofobj==='object'&&obj!==null}functionisEqual(obj1,obj2){if(!isObject(obj1)||!isObject(obj2)){returnobj1===obj2;}if(obj1===obj2){returntrue;}leto......