最近分析了PToptimizer,整個程序流程。大致如下:
1)導入優化的腳本文件,這個文件包絡萬象,輸入圖像的信息(roll,pitch,yaw, hfov,width,height,圖像的投影方法等),輸出全景圖的設置,控制點的羅列,優化參數的控制等(i,p,c,v),其中相對優化最重要的就是控制點和是否對參數進行優化。設置的正確與否,影響后面的優化結果。使用前,一定要好好看看Optimize.txt
2)根據script填充AlignInfo結構體,注意AlignInfo最后被注入了adjust.c的 static AlignInfo *optInfo中。初始LM輸入參數和輸出參數的函數,及重要的fcn都包含在結構體OptInfo中,整個LM算法都是圍繞AlignInfo和OptInfo展開的。驅動他們結合的是函數lmfunc fcn(它是個函數指針,實際調用int fcnPano(int m, int n, double x[], double fvec[], int *iflag) )。
3)計算誤差的函數就是上面提到的fcn,這個函數舉足輕重,要義深刻,根據width = 360, hfov = 360, height = 180的參考全景圖,利用圖像間匹配的控制點,不同投影模式,不同投影函數調用,來計算參數和誤差。
4)通過LM反復迭代,得到全局最優。(這部分還有一些不解,具體分析到代碼,再做討論)。
PToptimizer是hugin的靈魂,一點不過。心與心的碰觸,代碼與代碼的交叉,靈魂轉化,功力跟進。
1)導入優化的腳本文件,這個文件包絡萬象,輸入圖像的信息(roll,pitch,yaw, hfov,width,height,圖像的投影方法等),輸出全景圖的設置,控制點的羅列,優化參數的控制等(i,p,c,v),其中相對優化最重要的就是控制點和是否對參數進行優化。設置的正確與否,影響后面的優化結果。使用前,一定要好好看看Optimize.txt
2)根據script填充AlignInfo結構體,注意AlignInfo最后被注入了adjust.c的 static AlignInfo *optInfo中。初始LM輸入參數和輸出參數的函數,及重要的fcn都包含在結構體OptInfo中,整個LM算法都是圍繞AlignInfo和OptInfo展開的。驅動他們結合的是函數lmfunc fcn(它是個函數指針,實際調用int fcnPano(int m, int n, double x[], double fvec[], int *iflag) )。
3)計算誤差的函數就是上面提到的fcn,這個函數舉足輕重,要義深刻,根據width = 360, hfov = 360, height = 180的參考全景圖,利用圖像間匹配的控制點,不同投影模式,不同投影函數調用,來計算參數和誤差。
4)通過LM反復迭代,得到全局最優。(這部分還有一些不解,具體分析到代碼,再做討論)。
PToptimizer是hugin的靈魂,一點不過。心與心的碰觸,代碼與代碼的交叉,靈魂轉化,功力跟進。