張正友相機標定

2021-09-14 04:41:23 字數 3444 閱讀 9234

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 從計算機視覺角度理解成像過程 簡化成像模型 薄透鏡針孔模型 圖 成像過程 如上圖所示,從計算機...