1.關於資料說明
張正友標定2000<>:
lm演算法1978《the levenberg-marquardt algorithm, implementation and theory》:
opencv**參考:
其中關於calibratecamera函式可見:
此函式會輸出乙個3x3內參矩陣,乙個5維畸變係數,n幅影象即對應n個3維平移向量和3x3旋轉矩陣。輸出都是cv::mat資料格式。輸入是n幅影象的二維畫素點座標及其對應的物理座標系下的三維座標(注意:採用棋盤格時,z軸的座標是0),資料格式:
vector> corner_points_of_all_imgs;
vector> objectpoints;
工程檔案和見mail
matlab**參考:
定位到1372行的
static double cvcalibratecamera2internal( const cvmat* objectpoints,
const cvmat* imagepoints, const cvmat* npoints,
cvsize imagesize, int ifixedpoint, cvmat* cameramatrix, cvmat* distcoeffs,
cvmat* rvecs, cvmat* tvecs, cvmat* newobjpoints, cvmat* stddevs,
cvmat* perviewerrors, int flags, cvtermcriteria termcrit )
cvmat* cameramatrix是位址傳遞。
**分為步驟:
0.檢查引數和分配記憶體
1.初始化內參和lm解決器
2.初始化外參
3.開始優化
4.儲存結果
3.關於lm解決器
cvlevmarq solver( nparams, 0, termcrit );//即初始化類得到例項
關於nparams
const int nintrinsic = cv_calib_nintrinsic;
nparams = nintrinsic + nimages*6;
#define cv_calib_nintrinsic 18//#include "opencv2/core/types_c.h"
以下來自:
class cv_exports cvlevmarq;
cv::ptrmask; // 標記優化過程中不優化的量。0代表不優化,1代表優化。大小跟param相同
cv::ptrprevparam; // 前一步的優化引數,用途有兩個:1、判斷變數是否在變化,不變化停止迭代。2、在此引數上減去乙個高斯方向得到下乙個引數。
cv::ptrparam; // 所有要優化的變臉集合
cv::ptrj; // 目標函式的偏導數
cv::ptrerr; // 測量誤差向量
cv::ptrjtj; // 正規方程左側的部分
cv::ptrjtjn; // 去掉非優化變數後的正規方程左側部分
cv::ptrjterr; // 正規方程右側的部分
cv::ptrjtjv; // 去掉非優化變數的jterr,
cv::ptrjtjw; // 去掉非優化變數後待求向量
double preverrnorm, errnorm; // 測量誤差,更新前的測量誤差,更新後的測量誤差
int lambdalg10; // lm 演算法中的lanbda,此處的lamdalg10 加1代表lambda變大10倍,減1縮小10倍
cvtermcriteria criteria;
int state; // 優化步驟中的狀態
int iters; // 記錄迭代的次數
bool completesymmflag; // 使去掉非優化變數後的jtjn變成對稱矩陣,只是在updatealt函式是有用。
int solvemethod; // 正規方程的解法
};
張正友標定相機opencv原始碼簡化版【單獨摳出opencv原始碼用於個人相機標定】:
python版標定:
4.內參的初始化
在初始化內參的過程中,會先計算單應矩陣,再根據r1和r2的正交性得出乙個非齊次線性方程組(見公式張**中3和4公式,由於這裡先把有平移向量的單應矩陣轉換為無平移向量的單應矩陣,故這裡會只有二個引數,二個式子,對一幅影象而言),接著求解出n幅影象的單應矩陣,列出n個非齊次線性方程組,但是引數只有兩個1/fx^2和1/fy^2,接著利用
cvsolve(mata, _b, &_focal_length, cv_normal + cv_svd);//least-squares solution
最小二乘演算法求解出這兩個引數。主點就是影象的中心點。
這一共四個引數作為lm的初始值。
5.外參的初始化
在內參的基礎上,利用張**中9公式後的公式計算得出r1,r2,r3和t,其中主要涉及矩陣求逆、矩陣相乘和向量叉乘運算。
為了進一步優化外參,這裡也採用lm演算法對外參進行了優化。
cvlevmarq solver(6, count * 2, cvtermcriteria(cv_termcrit_eps + cv_termcrit_iter, max_iter, flt_epsilon), true);
6.關於lm演算法的計算過程
解決非線性最小化問題
x是乙個n維向量,f是乙個對映,該對映通過引數與向量做運算,最終輸出乙個m維向量,向量的範數最小,即求得最小時引數的值是多少。其中fi是乙個多元函式,即輸入乙個多元變數,輸出乙個值,這裡有m個多元函式對映,即對x做m次對映,將對映後的值的平方相加再除以2,記為代價函式的值。
其中張正友標定演算法中,第乙個包括4個內參+5個畸變係數;第二個包括n幅影象對應的3維旋轉向量和3維平移向量。
張正友相機標定法
1.為什麼需要相機標定 因為每個鏡頭在生產和組裝過程中可能會出現不同程度的畸變 畸變是一種光學錯位現象,通俗的講就是本來是直線的物體,實際拍出的效果是扭曲的 而通過相機標定可以矯正這種畸變,避免拍出的影象出現畸變。另外,可以根據相機標定得到的相機引數建立相機成像幾何模型,將世界座標系中的3d影象對映...
張正友相機標定(概括總結)
好,科普完畢,進入正題。計算機視覺基本上都要進行相機標定。標定的目的一是矯正畸變,二就是獲得三維空間不同點的位置關係。畸變主要分為徑向畸變和切向畸變。徑向畸變又可以分為桶形畸變和枕形畸變。徑向畸變的產生原因是鏡頭打磨時的不精確導致的。切向畸變是由於鏡頭與成像平面的不平行導致的。我們可以看出來越是遠離...
張正友標定學習
張正友標定學習 1 標定的理解 影象和三維空間的物體存在某一種對應關係,可以表示為x mx,而其中的m就表示一種幾何模型,這個相機模型中的引數就是相機引數,所以確定相機引數 內參 外參 的過程就為標定。2 從計算機視覺角度理解成像過程 簡化成像模型 薄透鏡針孔模型 圖 成像過程 如上圖所示,從計算機...