數值計算方法程式庫

2021-06-03 17:47:52 字數 2739 閱讀 4448

sparse bundle adjustment即稀疏集束調整,現在廣泛應用於計算機視覺領域,基本成為最後優化的標準演算法,就是在已經得到的初始攝像機引數和三維點資料的基礎針對投影誤差進行優化,得到使得均方投影誤差最小意義下的motion和structure。其演算法的核心是利用levenberg-marquardt演算法,由於視覺中問題的特殊性,造成矩陣稀疏,從而針對此特性進行求解。這裡介紹的是使用比較多的乙個工具函式庫,由希臘學者manolis i.a.lourakis和antonis a. argyros開發,**為:這裡我主要翻譯下其中介面函式的使用說明:

需要使用的結構體是struct sba_crsm, 定義如下:

struct sba_crsm{

int nr,nc; // 稀疏矩陣的行和列

int nnz;  //非0元素數量

int *val; //非0元素儲存空間,大小為nnz

int *colidx //非零元素的列下標,大小為nnz

int *rowptr; //val中開始一行的位置,大小為:nr+1, rowptr[nr] = nnz

本結構體用於儲存稀疏矩陣的元素

(根據其定義可以看出,其儲存過程其實對於稀疏矩陣按行掃瞄,得到非零元素出現的行和列,然後用colidx儲存列下標,rowptr儲存資料中新的一行出現的位置,非零結果存在val中。)

sparse bundle adjustment通過函式sba_motstr_levmar_x()執行,函式原型如下:

int sba_motstr_levmar_x(const int n, const int m, const int mcon, char * vmask, double *p, const int cnp, const int pnp, double *x, const int mnp,

void(*func)(double *p, struct sba_crsm * idxij, int *wk1, int *wk2, double *hx, void *adata),     

void(*fjac)(double *p, struct sba_crsm * idxij, int *wk1, int *wk2, double *hx, void *adata),

void *adata, int itmax, int verbose, double opts[3], double info[10];

函式執行成功終止則返回達到最小需要的迭代次數,否則輸入-1。當前版本中假設觀測向量的協方差矩陣為單位矩陣。函式的核心是通過lu分解求解線性系統,使用lapack實現。下面是用i,o分別表示輸入和輸出:

n: 3d點的數量。(i)

m:攝像機的數量(影象)(i)

mcon:從第乙個攝像機開始不需要修正引數的攝像機的數量。當我們將世界座標系與第乙個攝像機的座標對齊的時候,第乙個攝像機矩陣保持為[i 0] (i)

vmask:點的可見性標誌:mask[(i-1)*m  + j -1] = 1 如果點i在影象j中可見,否則為0.需要注意的是點和攝像機的表示從1,2開始而矩陣下標則是從0開始。vamsk的大小為n*m(i);

p:作為輸入,初始引數向量p0 = (a1,a2,…am, b1,b2,…bn)。作為輸出,估計的最小值,其大小為m*cnp+n*pnp (i/o);

cnp: 定義乙個攝像機的引數數量。例如,歐氏攝像機引數化使用6個引數(3個旋轉引數+3個平移引數)。如果使用四元數表述旋轉則引數的數量增加到7(4+3)。完整的透視攝像機使用11個引數表示,如果包括全域性的尺度因子則引數為12個 (i)

pnp:定義乙個3d 點需要的引數數量,對於歐氏幾何為3,對於投影空間為4 (i)

x:觀測向量x包括所有影象投影,順序為(x11,x12,…,x1m,….xnm).對於不可見的點,對應的xij消失。最大為n*m*mnp.(i)

mnp:定義乙個影象點引數的數量(一般為2) (i)

func:計算估計的引數向量的函式。  (i)

fjac:在jac中評估 處的稀疏雅可比行列式 (i)

adata:指向可能的額外資料的指標,傳遞給func,fjac。主要是為了避免對於全域性變數的直接應用(i)

itmax:levenberg-marquardt迭代的最大次數。 (i)

verbose:冗長程度。0表示冷靜的操作,大的值對應著增加冗長級別。(i)

opts:levenberg-marquardt演算法中最小化引數選項, ,分別對應著初始衰減項的尺度因子和結束的終止門限(i);

info:關於最小化輸出的資訊,如果不需要可以設定為null。(o)

info[0]: 初始引數估計的誤差。主要到info[0]除以所有的影象點觀測的數量對應著初始均方投影誤差;

info[1-4]:( , , , ),全部是在 計算得到的。類似於info[0],info[1]除以影象觀測點的數量得到最終的均方投影誤差;

info[5]:總的迭代次數;

info[6]:結束的原因:

1.過小的

2 過小的

3 迭代次數達到itmax

4 增強法方程矩陣奇異,最小化過程應該從當前解重新開始採用增加的衰減項;

info[7]:function評價的總的次數;

info[8]:fjac評價的總的次數;

info[9]:增強法方程求解總的次數。這個引數一般比總的迭代次數要大,由於在一次lm迭代中,可能需要多個引數進行嘗試,每乙個都需要對應的增強法方程的求解。

另外sba還提供了兩個函式sba_mot_levmar_x()和sba_str_levmat_x(),分別只對相機引數和結構引數優化投影誤差。

個別公式無法顯示

數值計算方法

數值計算方法知識面涉及微積分,線性代數 運用程式設計的方法來解決關於數值計算的問題,其中重點討論如何最小化誤差,一些方程的數值解法,以及插值和擬合問題。其中的知識可以作為資料探勘的基礎。執行 5.1 5 0.1和 1.5 1 0.5,給出執行結果,並簡要分析一下產生現象的原因 x1 5.1 5 0....

數值計算方法實驗

1.給定下述演算法框圖,用逐步掃瞄法和二分法求方程x5 3x 1 0的最小正根,要求準確到1 2 10 2。要求 1 取步長h 1,先用逐步掃瞄法程式設計搜尋乙個隔根區間,將搜尋到的隔根區間列印輸出 2 然後對該區間使用二分法求方程的滿足精度要求的根,每二分一次,用新生成區間長度的一半作為是否二分結...

Matlab 數值計算方法作業

2 簡單迭代法 3 牛頓迭代法 結果分析 二分法計算函式的零點 輸入求根區間a,b和求根精度abtol 函式輸出根的近似值,和迭代次數 function dichotomy a input 請輸入求根的下限,a b input 請輸入求根的上限,b abtol input 請輸入求根的精度,abto...