給出從不同視角拍攝的,描述同乙個場景的一系列,bundle adjustment可以根據所有點在影象中的投影作為標準,同時提煉出描述場景結構的3d點座標、相對運動引數和相機的光學引數。
通常在每個基於feature的3d場景重建演算法中都要用到bundle adjustment,作為每個基於特徵的多視重建視覺演算法的最後一步,它是基於3d結構和視角引數(即相機位置,朝向,固有標定和徑向畸變)的優化問題,用來獲得最佳的三維結構和運動(如相機矩陣)引數估計。提供初始估計,ba同時精化運動和結構引數,通過最小化觀測和**的影象點之間的投影誤差。在假定所獲得的影象特徵中有一些noise的基礎上獲得最佳重構效果:如果影象feature error服從標準高斯分布,那麼bundle adjustment就基於最大似然估計。bundle
adjustment的名字由來於每個3d特徵和相機光學中心「發射」出的光束,而這些光束可以根據結構和視角引數進行最佳調節。
用下式表示bundleadjustment的工作過程:
其中假設:光束平差法的最終目的歸結為:減少觀測影象的點和參考影象(**影象)的點之間位置投影變換(再投影)誤差。這最小化誤差演算法使用的是最小二乘演算法,目前使用最為成功是levenberg-marquardt, 它具有易於實現,對大範圍的初始估計能夠快速收斂的優點。n個3d點在m個view(拍攝場景)中,
向量xij:imgj上的第i個點projection(座標)這個是實際點座標
值vij:如果點i在imgj上有對映,則vij=1; elsevij=0;
每個imgj由向量aj引數化 每個3d點由bi引數化
q(ai,bj):點i在imgj上的predicted projection 這個是理想點座標
d(x,y):向量x,y的歐式距離
可見,bundleadjustment可以容忍特徵點的丟失。
這個公式的意義就是最小化n個點在兩幅圖上投影的誤差
光束法平差(ba)最小化一般通過levenberg-marquardt (lm)演算法來輔助完成。然而,由於許多未知的因素作用於最小投影誤差,乙個通用的lm演算法的實現(如minpack的 lmder)當應用於ba背景下的定義的最小化問題時,會帶來極高的計算代價。
在基本的法方程中不同的三維點和相機引數相互之間影響較小,呈現一種稀疏的塊結構(如圖)。
乙個基於levenberg-marquardt(lm)演算法的通用稀疏光束法平差sba利用這種稀疏的特性,使用lm演算法的簡化的稀疏變數來降低計算的複雜度。sba是通用的,因為它保證了使用者對於相機和三維結構的描述引數的定義的完全控制。因此,它事實上可以支援任何多視重建問題的顯示和引數化。比如任意投影相機,部分的或完全標定的相機,由固定的三維點進行外方位元素(即姿態)的估計,精化本徵引數,等等。使用者要想在這類問題中使用sba,只需要提供合適的程式對這些問題和引數來計算估計的影象投影和他們的函式行列式(jacobian)。sba包含了檢查使用者提供的函式行列式的一致性的程式。
bundle adjustment 光束法平差
推薦文獻 bundle adjustment method using sparse bfgs solution 這篇 是一篇介紹了光束法平差的原理的sci,今年 2018年 剛發表的,來自北大的 文章分析了ba的原理,並介紹了高斯牛頓和lm的 和不足之處,最後這篇 提出了一種基於擬牛頓法 bfgs...
Eigne實現光束法平差
include include include include include include include sophus se3.h using namespace std using namespace eigen using namespace cv typedef vector vecve...
基於opencv2的相片拼接(光束法平差)
主要是供無人機的相片使用,原理這裡就不詳述了。直接貼 qt 4 5作為資料讀入支援 include include include include include using namespace std using namespace cv int main int argc,char argv a...