关键函数:双目计算匹配的方法
void Frame::ComputeStereoMatches()
步骤一:
建立特征点搜索范围对应表,一个特征点在一个带状区域内搜索匹配特征点
// 匹配搜索的时候,不仅仅是在一条横线上搜索,而是在一条横向搜索带上搜索,简而言之,原本每个特征点的纵坐标为1,这里把特征点体积放大,纵坐标占好几行
// 例如左目图像某个特征点的纵坐标为20,那么在右侧图像上搜索时是在纵坐标为18到22这条带上搜索,搜索带宽度为正负2,搜索带的宽度和特征点所在金字塔层数有关,尺度越大其位置不确定性越高,所以其搜索半径越大
// 简单来说,如果纵坐标是20,特征点在图像第20行,那么认为18 19 20 21 22行都有这个特征点
// vRowIndices[18]、vRowIndices[19]、vRowIndices[20]、vRowIndices[21]、vRowIndices[22]都有这个特征点编号
对左目相机每个特征点,通过描述子在右目带状搜索区域找到匹配点
步骤二:
,通过SAD做滑动窗口匹配
获得的是像素级的修正量bestincR
步骤三:做抛物线拟合找谷底得到亚像素匹配deltaR
为何需要进行亚像素定位?
数字图像通常是被离散化成像素形式;
每个像素对应一个整数坐标位置;
整数坐标位置对于很多应用然而并不精确,比如跟踪、相机标定、图像配准、图像拼接以及三维重构;
为达到有些应用的精确性,需要精确到浮点坐标位置;
所以会涉及到亚像素定位问题。亚像素定位就是计算特征所在图像中的真实位置,而真实位置有时候并不在像素所在整数坐标位置上,而是在像素的内部。
利用抛物线插值得到了亚像素级的修正量deltaR
步骤四:
利用一次描述子匹配,两次修正之后的特征点匹配,通过视差计算深度。