攝像機標定程序中用到的OpenCV函數

FindChessboardCorners 尋找棋盤圖的內角點位置

 

int cvFindChessboardCorners( const void*image, CvSize pattern_size,

CvPoint2D32f* corners,int* corner_count=NULL,

int flags=CV_CALIB_CB_ADAPTIVE_THRESH );

 

image

輸入的棋盤圖,必須是8位的灰度或者彩色圖像。

pattern_size

棋盤圖中每行和每列角點的個數。

corners

檢測到的角點

corner_count

輸出,角點的個數。如果不是NULL,函數將檢測到的角點的個數存儲於此變量。

flags

各種操作標誌,可以是0或者下面值的組合:

CV_CALIB_CB_ADAPTIVE_THRESH - 使用自適應閾值(通過平均圖像亮度計算得到)將圖像轉換爲黑白圖,而不是一個固定的閾值。

CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定閾值或者自適應的閾值進行二值化之前,先使用cvNormalizeHist來均衡化圖像亮度。

CV_CALIB_CB_FILTER_QUADS - 使用其他的準則(如輪廓面積,周長,方形形狀)來去除在輪廓檢測階段檢測到的錯誤方塊。

函數cvFindChessboardCorners試圖確定輸入圖像是否是棋盤模式,並確定角點的位置。如果所有角點都被檢測到切它們都被以一定順序排布(一行一行地,每行從左到右),函數返回非零值,否則在函數不能發現所有角點或者記錄它們地情況下,函數返回0。例如一個正常地棋盤圖右8x8個方塊和7x7個內角點,內角點是黑色方塊相互聯通地位置。這個函數檢測到地座標只是一個大約地值,如果要精確地確定它們的位置,可以使用函數cvFindCornerSubPix。

 

 


FindCornerSubPix 尋找棋盤圖的內角點位置

精確角點位置

void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,

                        int count, CvSize win, CvSize zero_zone,

                         CvTermCriteria criteria );

image

輸入圖像.

corners

輸入角點的初始座標,也存儲精確的輸出座標

count

角點數目

win

搜索窗口的一半尺寸。如果win=(5,5) 那麼使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口

zero_zone

死區的一半尺寸,死區爲不對搜索區的中央位置做求和運算的區域。它是用來避免自相關矩陣出現的某些可能的奇異性。當值爲 (-1,-1) 表示沒有死區。

criteria

求角點的迭代過程的終止條件。即角點位置的確定,要麼迭代數大於某個設定值,或者是精確度達到某個設定值。 criteria 可以是最大迭代數目,或者是設定的精確度,也可以是它們的組合。

函數cvFindCornerSubPix通過迭代來發現具有子象素精度的角點位置,或如圖所示的放射鞍點(radial saddle points)。

子象素級角點定位的實現是基於對向量正交性的觀測而實現的,即從中央點q到其鄰域點p 的向量和p點處的圖像梯度正交(服從圖像和測量噪聲)。考慮以下的表達式:

εi=DIpiT·(q-pi)

其中,DIpi表示在q的一個鄰域點pi處的圖像梯度,q的值通過最小化εi得到。通過將εi設爲0,可以建立系統方程如下:

sumi(DIpi·DIpiT)·q - sumi(DIpi·DIpiT·pi) = 0

其中q的鄰域(搜索窗)中的梯度被累加。調用第一個梯度參數G和第二個梯度參數b,得到:

q=G-1·b

該算法將搜索窗的中心設爲新的中心q,然後迭代,直到找到低於某個閾值點的中心位置。

 


DrawChessBoardCorners 繪製檢測到的棋盤角點

 

void cvDrawChessboardCorners( CvArr* image,CvSize pattern_size,CvPoint2D32f*corners,

int count,int pattern_was_found );

 

image

結果圖像,必須是8位彩色圖像。

pattern_size

每行和每列地內角點數目。

corners

檢測到地角點數組。

count

角點數目。

pattern_was_found

指示完整地棋盤被發現(≠0)還是沒有發現(=0)。可以傳輸cvFindChessboardCorners函數的返回值。

當棋盤沒有完全檢測出時,函數cvDrawChessboardCorners以紅色圓圈繪製檢測到的棋盤角點;如果整個棋盤都檢測到,則用直線連接所有的角點。

 


CalibrateCamera2利用定標來計算攝像機的內參數和外參數

void cvCalibrateCamera2 ( const CvMat* object_points,

               constCvMat* image_points,const CvMat* point_counts,

               CvSizeimage_size, CvMat* intrinsic_matrix,

               CvMat*distortion_coeffs, CvMat* rotation_vectors=NULL,

               CvMat*translation_vectors=NULL, int flags=0 );

 

object_points

定標點的世界座標,爲3xN或者Nx3的矩陣,這裏N是所有視圖中點的總數。

image_points

定標點的圖像座標,爲2xN或者Nx2的矩陣,這裏N是所有視圖中點的總數。

point_counts

向量,指定不同視圖裏點的數目,1xM或者Mx1向量,M是視圖數目。

image_size

圖像大小,只用在初始化內參數時。

intrinsic_matrix

輸出內參矩陣(A) ,如果指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部分或者全部必須被初始化。

distortion_coeffs

輸出大小爲4x1或者1x4的向量,裏面爲形變參數[k1, k2, p1, p2]。

rotation_vectors

輸出大小爲3xM或者Mx3的矩陣,裏面爲旋轉向量(旋轉矩陣的緊湊表示方式,具體參考函數cvRodrigues2)

translation_vectors

輸出大小爲3xM或Mx3的矩陣,裏面爲平移向量。

flags

不同的標誌,可以是0,或者下面值的組合:

·  CV_CALIB_USE_INTRINSIC_GUESS- 內參數矩陣包含fx,fy,cx和cy的初始值。否則,(cx,cy)被初始化到圖像中心(這兒用到圖像大小),焦距用最小平方差方式計算得到。注意,如果內部參數已知,沒有必要使用這個函數,使用cvFindExtrinsicCameraParams2則可。

·  CV_CALIB_FIX_PRINCIPAL_POINT- 主點在全局優化過程中不變,一直在中心位置或者在其他指定的位置(當CV_CALIB_USE_INTRINSIC_GUESS設置的時候)。

·  CV_CALIB_FIX_ASPECT_RATIO- 優化過程中認爲fx和fy中只有一個獨立變量,保持比例fx/fy不變,fx/fy的值跟內參數矩陣初始化時的值一樣。在這種情況下, (fx, fy)的實際初始值或者從輸入內存矩陣中讀取(當CV_CALIB_USE_INTRINSIC_GUESS被指定時),或者採用估計值(後者情況中fx和fy可能被設置爲任意值,只有比值被使用)。

·  CV_CALIB_ZERO_TANGENT_DIST– 切向形變參數(p1, p2)被設置爲0,其值在優化過程中保持爲0。

函數cvCalibrateCamera2從每個視圖中估計相機的內參數和外參數。3維物體上的點和它們對應的在每個視圖的2維投影必須被指定。這些可以通過使用一個已知幾何形狀切具有容易檢測的特徵點的物體來實現。這樣的一個物體被稱作定標設備或者定標模式,OpenCV有內建的把棋盤當作定標設備方法(參考cvFindChessboardCorners)。目前,傳入初始化的內參數(當CV_CALIB_USE_INTRINSIC_GUESS被設置時)只支持平面定標設備(物體點的Z座標必須時全0或者全1)。不過3維定標設備依然可以用在提供初始內參數矩陣情況。在內參數和外參數矩陣的初始值都計算出之後,它們會被優化用來減小反投影誤差(圖像上的實際座標跟cvProjectPoints2計算出的圖像座標的差的平方和)。

 


Undistort2校正圖像因相機鏡頭引起的變形

void cvUndistort2( const CvArr* src, CvArr* dst,

                  const CvMat* intrinsic_matrix,

                  const CvMat* distortion_coeffs );

 

src

原始圖像(已經變形的圖像)。

dst

結果圖像(已經校正的圖像)。

intrinsic_matrix

相機內參數矩陣,格式爲 。

distortion_coeffs

四個變形係數組成的向量,大小爲4x1或者1x4,格式爲[k1,k2,p1,p2]。

函數cvUndistort2對圖像進行變換來抵消徑向和切向鏡頭變形。相機參數和變形參數可以通過函數cvCalibrateCamera2取得。使用本節開始時提到的公式,對每個輸出圖像像素計算其在輸入圖像中的位置,然後輸出圖像的像素值通過雙線性插值來計算。如果圖像得分辨率跟定標時用得圖像分辨率不一樣,fx、fy、cx和cy需要相應調整,因爲形變並沒有變化。

 


FindExtrinsicCameraParams2計算指定視圖的攝像機外參數

void cvFindExtrinsicCameraParams2 ( const CvMat*object_points,

                                   const CvMat*image_points,

                                   const CvMat*intrinsic_matrix,

                                   const CvMat*distortion_coeffs,

                                   CvMat*rotation_vector,

                                   CvMat*translation_vector );

object_points

定標點的座標,爲3xN或者Nx3的矩陣,這裏N是視圖中的個數。

image_points

定標點在圖像內的座標,爲2xN或者Nx2的矩陣,這裏N是視圖中的個數。

intrinsic_matrix

內參矩陣(A) 。

distortion_coeffs

大小爲4x1或者1x4的向量,裏面爲形變參數[k1,k2,p1,p2]。如果是NULL,所有的形變係數都爲0。

rotation_vector

輸出大小爲3x1或者1x3的矩陣,裏面爲旋轉向量(旋轉矩陣的緊湊表示方式,具體參考函數cvRodrigues2)。

translation_vector

大小爲3x1或1x3的矩陣,裏面爲平移向量。

函數cvFindExtrinsicCameraParams2使用已知的內參數和某個視圖的外參數來估計相機的外參數。3維物體上的點座標和相應的2維投影必須被指定。這個函數也可以用來最小化反投影誤差。

 

 


GoodFeaturesToTrack 確定圖像的強角點

 

void cvGoodFeaturesToTrack( const CvArr*image, CvArr* eig_image, CvArr* temp_image,

CvPoint2D32f* corners, int* corner_count,

double quality_level, double min_distance,

const CvArr* mask=NULL );

image

輸入圖像,8-位或浮點32-比特,單通道

eig_image

臨時浮點32-位圖像,尺寸與輸入圖像一致

temp_image

另外一個臨時圖像,格式與尺寸與 eig_image 一致

corners

輸出參數,檢測到的角點

corner_count

輸出參數,檢測到的角點數目

quality_level

最大最小特徵值的乘法因子。定義可接受圖像角點的最小質量因子。

min_distance

限制因子。得到的角點的最小距離。使用 Euclidian 距離

mask

ROI:感興趣區域。函數在ROI中計算角點,如果 mask 爲 NULL,則選擇整個圖像。

函數cvGoodFeaturesToTrack 在圖像中尋找具有大特徵值的角點。該函數,首先用cvCornerMinEigenVal 計算輸入圖像的每一個象素點的最小特徵值,並將結果存儲到變量 eig_image 中。然後進行非最大值抑制(僅保留3x3鄰域中的局部最大值)。下一步將最小特徵值小於 quality_level?max(eig_image(x,y)) 排除掉。最後,函數確保所有發現的角點之間具有足夠的距離,(最強的角點第一個保留,然後檢查新的角點與已有角點之間的距離大於 min_distance )。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章