https://blog.csdn.net/u011178262/article/details/74159480
基本矩阵体现了两视图几何(对极几何,epipolar geometry)的内在射影几何(projective geometry)关系,基本矩阵只依赖于摄像机的内参K和外参R,t;
本质矩阵是归一化图像坐标下的基本矩阵的特殊情况。其参数由运动的位姿决定,与相机内参无关;
单应是射影几何中的概念,又称为射影变换。他把一个射影平面上的点映射到另一个平面对应的位置,并且把直线映射为直线,具有保线性质。与对极几何不同的是,对极几何将点映射到线上,而单应矩阵是点对点的关系。
https://blog.csdn.net/kokerf/article/details/72191054
E = t R F = K − T E K − 1 E=t^R \\ F=K^{-T}EK^{-1} E=tRF=K−TEK−1
H = K ( R − t n T d ) K − 1 H=K(R-\frac{tn^T}{d})K^{-1} H=K(R−dtnT)K−1
在相机只有旋转而没有平移的情况,此时t为0,E也将为0,导致无法求解R,这时可以使用单应矩阵H求旋转,但仅有旋转,无法三角化求深度。
E = t ∧ R , t = ( t 1 , t 2 , t 3 ) , t ∧ = [ 0 − t 3 t 2 t 3 0 − t 1 − t 2 t 1 0 ] t 1 , t 2 , t 3 至 少 一 个 不 为 0 , 否 则 就 没 有 平 移 了 , 假 设 是 有 两 个 或 者 一 个 为 0 , 显 然 必 有 R ( t ∧ ) = 2 , 若 都 不 为 0 , 化 简 t ∧ : [ 0 − t 3 t 2 t 3 0 − t 1 − t 2 t 1 0 ] ⟶ [ 0 − t 3 t 2 t 2 t 3 0 − t 2 t 1 − t 2 t 3 t 1 t 3 0 ] ⟶ [ 0 − t 3 t 2 0 t 1 t 3 − t 2 t 1 − t 2 t 3 t 1 t 3 0 ] ⟶ [ 0 − t 1 t 3 t 1 t 2 0 t 1 t 3 − t 2 t 1 − t 2 t 3 t 1 t 3 0 ] ⟶ [ 0 0 0 0 t 1 t 3 − t 2 t 1 − t 2 t 3 t 1 t 3 0 ] ⟶ R ( t ∧ ) = 2 E=t^{\land}R,t=(t_1,t_2,t_3),t^{\land}=\begin{bmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{bmatrix} \\ t_1,t_2,t_3至少一个不为0,否则就没有平移了,假设是有两个或者一个为0,显然必有R(t^{\land})=2,若都不为0,化简\\t^{\land}:\begin{bmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{bmatrix} \longrightarrow \begin{bmatrix} 0 & -t_3 & t_2 \\ t_2t_3 & 0 & -t_2t_1 \\ -t_2t_3 & t_1t_3 & 0 \end{bmatrix}\longrightarrow \begin{bmatrix} 0 & -t_3 & t_2 \\ 0 & t_1t_3 & -t_2t_1 \\ -t_2t_3 & t_1t_3 & 0 \end{bmatrix} \\ \longrightarrow \begin{bmatrix} 0 & -t_1t_3 & t_1t_2 \\ 0 & t_1t_3 & -t_2t_1 \\ -t_2t_3 & t_1t_3 & 0 \end{bmatrix} \longrightarrow \begin{bmatrix} 0 & 0 & 0 \\ 0 & t_1t_3 & -t_2t_1 \\ -t_2t_3 & t_1t_3 & 0 \end{bmatrix} \longrightarrow R(t^{\land})=2 E=t∧R,t=(t1,t2,t3),t∧=⎣⎡0t3−t2−t30t1t2−t10⎦⎤t1,t2,t3至少一个不为0,否则就没有平移了,假设是有两个或者一个为0,显然必有R(t∧)=2,若都不为0,化简t∧:⎣⎡0t3−t2−t30t1t2−t10⎦⎤⟶⎣⎡0t2t3−t2t3−t30t1t3t2−t2t10⎦⎤⟶⎣⎡00−t2t3−t3t1t3t1t3t2−t2t10⎦⎤⟶⎣⎡00−t2t3−t1t3t1t3t1t3t1t2−t2t10⎦⎤⟶⎣⎡00−t2t30t1t3t1t30−t2t10⎦⎤⟶R(t∧)=2
R是旋转矩阵,是可逆矩阵,秩是3,因此R(E)=R(t^ R)=R(t^)=2
F = K − T E K − 1 F=K^{-T}EK^{-1} F=K−TEK−1
显然R(F)=R(E)
平移t的自由度是3,旋转矩阵R的自由度是3,E=t^R加在一起是6个参数,也就是要想确定E矩阵,确定6个参数就可以。同时E满足尺度等价性约束,所以F的自由度是6-1=5.
E矩阵一对匹配点只能构造一个约束方程,因此至少需要五对匹配点才能计算(五点法,另外还有八点法):
考 虑 一 对 匹 配 点 x 1 = [ u 1 , v 1 , 1 ] T , x 2 = [ u 2 , v 2 , 1 ] T , 跟 据 对 极 约 束 : ⟶ [ u 1 v 1 1 ] [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] [ u 2 v 2 1 ] = 0 ⟶ 把 E 展 开 写 出 向 量 形 式 : u 2 u 2 e 1 + u 1 v 2 e 2 + u 1 e 3 + v 1 u 2 e 4 + v 1 v 2 e 5 + v 1 e 6 + u 2 e 7 + v 2 e 8 + e 9 = 0 考虑一对匹配点x_1=[u_1,v_1,1]^T,x_2=[u_2,v_2,1]^T,跟据对极约束:\\ \longrightarrow \begin{bmatrix} u_1 & v_1 & 1 \end{bmatrix}\begin{bmatrix} e_1 & e_2 & e_3 \\ e_4 & e_5 & e_6 \\ e_7 & e_8 & e_9 \end{bmatrix} \begin{bmatrix} u_2 \\ v_2 \\ 1 \end{bmatrix}=0\\ \longrightarrow 把E展开写出向量形式: u_2u_2e_1+u_1v_2e_2+u_1e_3+v_1u_2e_4+v_1v_2e_5+v_1e_6+u_2e_7+v_2e_8+e_9=0 考虑一对匹配点x1=[u1,v1,1]T,x2=[u2,v2,1]T,跟据对极约束:⟶[u1v11]⎣⎡e1e4e7e2e5e8e3e6e9⎦⎤⎣⎡u2v21⎦⎤=0⟶把E展开写出向量形式:u2u2e1+u1v2e2+u1e3+v1u2e4+v1v2e5+v1e6+u2e7+v2e8+e9=0
F = K − T E K − 1 F=K^{-T}EK^{-1} F=K−TEK−1
相机内参的待定参数为4,E矩阵自由度5,所以计算F的自由度最大是9。
同时F满足下面两个约束,所以F的自由度是9-2=7.
(1)尺度等价性
(2)det(F)=0
F矩阵一对匹配点同样只能构造一个约束方程,因此至少需要7对匹配点才能计算(七点法,另外还有八点法)
单应矩阵9个未知参数,具有尺度等价性:9-1=8
考 虑 一 对 匹 配 点 x 1 = [ u 1 , v 1 , 1 ] T , x 2 = [ u 2 , v 2 , 1 ] T , H 是 单 应 矩 阵 : ⟶ [ u 2 v 2 1 ] = [ h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 h 9 ] [ u 1 v 1 1 ] ⟶ u 2 = h 1 u 1 + h 2 v 1 + h 3 h 7 u 1 + h 8 v 1 + h 9 , v 2 = h 4 u 1 + h 5 v 1 + h 6 h 7 u 1 + h 8 v 1 + h 9 考虑一对匹配点x_1=[u_1,v_1,1]^T,x_2=[u_2,v_2,1]^T,H是单应矩阵:\\ \longrightarrow \begin{bmatrix} u_2\\ v_2\\ 1 \end{bmatrix}=\begin{bmatrix} h_1 & h_2 & h_3 \\ h_4 & h_5 & h_6 \\ h_7 & h_8 & h_9 \end{bmatrix} \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix}\\ \longrightarrow u_2=\frac{h_1u_1+h_2v_1+h_3}{h_7u_1+h_8v_1+h_9},v_2=\frac{h_4u_1+h_5v_1+h_6}{h_7u_1+h_8v_1+h_9} 考虑一对匹配点x1=[u1,v1,1]T,x2=[u2,v2,1]T,H是单应矩阵:⟶⎣⎡u2v21⎦⎤=⎣⎡h1h4h7h2h5h8h3h6h9⎦⎤⎣⎡u1v11⎦⎤⟶u2=h7u1+h8v1+h9h1u1+h2v1+h3,v2=h7u1+h8v1+h9h4u1+h5v1+h6
因此一组匹配点对可以构造出两个约束,因此至少4对点(不共线)就可以计算单应矩阵。
单目相机根据一张图片无法得出一张图片中物体的实际大小,同理也就无法得出运动的尺度大小,这是产生尺度漂移的根源。而在优化过程中,单目相机使用对极几何中的三角测量原理,而三角测量中,极小的角度误差在累积之后深度不确定都会变得很大,从而无法保证尺度一致性。修正方式是通过回环检测。
Scale Drift-Aware Large Scale Monocular SLAM
RANSAC算法的优点是能鲁棒的估计模型参数。例如,他能从包含大量局外点的数据集中估计出高精度的参数。缺点是它计算参数的迭代次数没有上限,如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到的可信的模型,概率与迭代次数成正比。另一个缺点是它要求设置跟问题相关的阈值,RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。
RANSAC 方法可以从有误匹配的点对应集中估计基本矩阵,这使得从两幅图像自动估计基本矩 阵成为可能。基本矩阵自动估计的步骤如下:
//mvSets是初始“匹配对集” ,mMaxIterations=200,初始化了200个大小为8,所有值是0的点集
mvSets = vector< vector<size_t> >(mMaxIterations,vector<size_t>(8,0));
DUtils::Random::SeedRandOnce(0);
for(int it=0; it<mMaxIterations; it++)
{
vAvailableIndices = vAllIndices;
// Select a minimum set
for(size_t j=0; j<8; j++)
{
// 产生0到N-1的随机数
int randi = DUtils::Random::RandomInt(0,vAvailableIndices.size()-1);
// idx表示哪一个索引对应的特征点被选中
int idx = vAvailableIndices[randi];
mvSets[it][j] = idx;
// randi对应的索引已经被选过了,从容器中删除
// randi对应的索引用最后一个元素替换,并删掉最后一个元素
vAvailableIndices[randi] = vAvailableIndices.back();
vAvailableIndices.pop_back();
}
}
随机从数据集中随机抽出8个样本数据,计算当前抽样所确定的基本矩阵 F模型,记为M;
计算数据集中所有数据(所有内点)与模型M的重投影误差,这里利用卡方检验进行选取内点,若误差小于阈值,加入内点集 I (vbCurrentInliers),并且获得模型的当次RANSAC的结果评分;
如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I
如果迭代次数大于200,则退出 ; 否则迭代次数加1,并重复上述步骤;
vector<bool> vbCurrentInliers(N,false);
float currentScore;
// Perform all RANSAC iterations and save the solution with highest score
for(int it=0; it<mMaxIterations; it++)
{
// Select a minimum set
for(int j=0; j<8; j++)
{
int idx = mvSets[it][j];
vPn1i[j] = vPn1[mvMatches12[idx].first];
vPn2i[j] = vPn2[mvMatches12[idx].second];
}
cv::Mat Fn = ComputeF21(vPn1i,vPn2i);
F21i = T2t*Fn*T1;
// 利用重投影误差为当次RANSAC的结果评分
currentScore = CheckFundamental(F21i, vbCurrentInliers, mSigma);
if(currentScore>score)
{
F21 = F21i.clone();
vbMatchesInliers = vbCurrentInliers;
score = currentScore;
}
}
随机从数据集中随机抽出8个样本数据,计算出变换矩阵H,记为模型M;
计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;
如果当前内点集 I 元素个数大于最优内点集 I_best(也就是得分比较高) , 则更新 I_best = I;
如果迭代次数大于200,则退出 ; 否则迭代次数加1,并重复上述步骤;
// 每次RANSAC的MatchesInliers与得分
vector<bool> vbCurrentInliers(N,false);
float currentScore;
// Perform all RANSAC iterations and save the solution with highest score
for(int it=0; it<mMaxIterations; it++)
{
// Select a minimum set
for(size_t j=0; j<8; j++)
{
int idx = mvSets[it][j];
// vPn1i和vPn2i为匹配的特征点对的坐标
vPn1i[j] = vPn1[mvMatches12[idx].first];
vPn2i[j] = vPn2[mvMatches12[idx].second];
}
cv::Mat Hn = ComputeH21(vPn1i,vPn2i);
// 恢复原始的均值和尺度
H21i = T2inv*Hn*T1;
H12i = H21i.inv();
// 利用重投影误差为当次RANSAC的结果评分
currentScore = CheckHomography(H21i, H12i, vbCurrentInliers, mSigma);
// 得到最优的vbMatchesInliers与score
if(currentScore>score)
{
H21 = H21i.clone();
vbMatchesInliers = vbCurrentInliers;
score = currentScore;
}
}
也就是说迭代次数是如何确定的?
在执行 RANSAC 时,通常没有必要尝试每一种可能的抽样,实际上尝试每一种可能的抽样在 计算上也是不可行的。只要选择足够多的抽样次数 K,保证至少能得一个好样本就可以了。
RANSAC是一种概率算法,为了能确保有更好的概率找到真正的内点集合,必须实验足够多的次数。以下为试验次数的计算过程:
1、假设每次选取测量点都是相互独立的,且每个测量点为内点的概率均为w,p为经过k次试验后成功的总体概率;
2、那么在某次实验中,n个随机样本都是内点的可能性是wn(这里n表示为拟合该模型需要的最少数据个数);
3、因此经过了p次试验,失败的概率是:
1 − p = ( 1 − w n ) k 1-p=(1-w^n)^k 1−p=(1−wn)k
得到最少需要的试验次数为:
k = l o g ( 1 − p ) l o g ( 1 − w n ) k=\frac{log(1-p)}{log(1-w^n)} k=log(1−wn)log(1−p)
也就是说K受到外点比例以及模型自由度的影响。
图表来自《计算机视觉中的数学方法》
也就是说在其他因素(内点比例)等固定的情况下,模型的自由度越高,选出好模型需要的迭代次数越高。
特征点的尺度不变形:建立金字塔,来实现特征点的多尺度不变性。设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(pencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。
参考自:https://blog.csdn.net/weixin_44580210/article/details/89514870
优点:计算简单;提取的点特征均匀且合理;稳定,稳定Harris算子对图像旋转、亮度变化、噪声影响和视点变换不敏感。
缺点:对尺度很敏感,不具有尺度不变性;提取的角点精度是像素级的;需要设计角点匹配算法
基于特征描述子的方法-harris
优点:SIFT特征对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
SUFT是对SIFT的改进,他们在思路上是一致的,只是采用的方法不同而已
三角化的误差来源有哪几方面:
a.图像的分辨率:图像的分辨率越高,一个像素所带来的δβ就越小。
b.特征点求取时的精度:是否做到亚像素,在亚像素的基础上,误差有多大?
c.p1点的误差:会引起极线l2的误差,从而间接地影响p2点的精度(特征点匹配误差)。
d.相机两次位置的平移向量t的大小
所以,这也体现出来了三角化的矛盾:若想提高三角化的精度,其一提高特征点的提取精度,即提高图像的分辨率,但这会导致图像的增大,增加计算成本;其二,使平移量增大,但这会导致图像外观的明显变化,外观变化会使得特征提取与匹配变得困难。总而言之,平移太大,会导致匹配失效;平移太小,三角化精度不够。
参考:三角化—深度滤波器《视觉SLAM14讲》
https://blog.csdn.net/weixin_44580210/article/details/87214464#12_SLAM_192
《视觉SLAM14讲》
《计算机视觉中的数学方法》