免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Cv照相機定標(biāo)和三維重建

 花園圖書館88 2013-09-15

針孔相機模型和變形

這一節(jié)里的函數(shù)都使用針孔攝像機模型,這就是說,一幅視圖是通過透視變換將三維空間中的點投影到圖像平面。投影公式如下:

s \cdot m' = A\cdot[R|t] \cdot M'或者

s\cdot  \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} fx & 0 & cx \\ 0 & fy & cy \\ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_{1} \\ r_{21} & r_{22} & r_{23} & t_{2} \\ r_{31} & r_{32} & r_{33} & t_{3} \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}

這里(X, Y, Z)是一個點的世界坐標(biāo),(u, v)是點投影在圖像平面的坐標(biāo),以像素為單位。A被稱作攝像機矩陣,或者內(nèi)參數(shù)矩陣。(cx, cy)是基準(zhǔn)點(通常在圖像的中心),fx, fy是以像素為單位的焦距。所以如果因為某些因素對來自于攝像機的一幅圖像升采樣或者降采樣,所有這些參數(shù)(fx, fy, cx和cy)都將被縮放(乘或者除)同樣的尺度。內(nèi)參數(shù)矩陣不依賴場景的視圖,一旦計算出,可以被重復(fù)使用(只要焦距固定)。旋轉(zhuǎn)-平移矩陣[R|t]被 稱作外參數(shù)矩陣,它用來描述相機相對于一個固定場景的運動,或者相反,物體圍繞相機的的剛性運動。也就是[R|t]將點(X, Y, Z)的坐標(biāo)變換到某個坐標(biāo)系,這個坐標(biāo)系相對于攝像機來說是固定不變的。上面的變換等價與下面的形式(z≠0):

\begin{bmatrix}x \\ y \\z \end{bmatrix} = R \cdot \begin{bmatrix}X \\ Y \\Z \end{bmatrix} + t

x' = x / z

y' = y / z

u=fx \cdot x' + cx

v=fy \cdot y' + cy

真正的鏡頭通常有一些形變,主要的變形為徑向形變,也會有輕微的切向形變。所以上面的模型可以擴展為:

\begin{bmatrix}x \\ y \\z \end{bmatrix} = R \cdot \begin{bmatrix}X \\ Y \\Z \end{bmatrix} + t

x' = x / z

y' = y / z

x'' = x' \cdot (1 + k_1 \cdot r^2 + k_2 \cdot r^4) + 2 \cdot p_1 \cdot x'\cdot y' + p_2 \cdot (r^2+2x'^2)

y'' = y' \cdot (1 + k_1 \cdot r^2 + k_2 \cdot r^4) + p_1 \cdot (r^2+2 \cdot y'^2) + 2 \cdot p_2 \cdot x'\cdot y'

這里 r2 = x'2 + y'2

u = fx \cdot x'' + cx

v = fy \cdot y'' + cy

k1k2是徑向形變系數(shù),p1p1是切向形變系數(shù)。OpenCV中沒有考慮高階系數(shù)。形變系數(shù)跟拍攝的場景無關(guān),因此它們是內(nèi)參數(shù),而且與拍攝圖像的分辨率無關(guān)。

后面的函數(shù)使用上面提到的模型來做如下事情:

  • 給定內(nèi)參數(shù)和外參數(shù),投影三維點到圖像平面。
  • 給定內(nèi)參數(shù)、幾個三維點坐標(biāo)和其對應(yīng)的圖像坐標(biāo),來計算外參數(shù)。
  • 根據(jù)已知的定標(biāo)模式,從幾個角度(每個角度都有幾個對應(yīng)好的3D-2D點對)的照片來計算相機的外參數(shù)和內(nèi)參數(shù)。

照相機定標(biāo)

ProjectPoints2       //本函數(shù)實現(xiàn)由現(xiàn)實中的點的坐標(biāo)找到圖像中的點的坐標(biāo)

投影三維點到圖像平面

void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector,
                       const CvMat* translation_vector, const CvMat* intrinsic_matrix,
                       const CvMat* distortion_coeffs, CvMat* image_points,
                       CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL,
                       CvMat* dpdc=NULL, CvMat* dpddist=NULL );
object_points
物體點的坐標(biāo),為3xN或者Nx3的矩陣,這兒N是視圖中的所有所有點的數(shù)目。
rotation_vector   //世界坐標(biāo)系與相機坐標(biāo)系之間的旋轉(zhuǎn)
旋轉(zhuǎn)向量,1x3或者3x1。
translation_vector
平移向量,1x3或者3x1。
intrinsic_matrix
攝像機內(nèi)參數(shù)矩陣A:\begin{bmatrix}fx & 0 & cx\\ 0 & fy & cy\\ 0&0&1\end{bmatrix}
distortion_coeffs
形變參數(shù)向量,4x1或者1x4,為[k1,k2,p1,p2]。如果是NULL,所有形變系數(shù)都設(shè)為0。
image_points
輸出數(shù)組,存儲圖像點坐標(biāo)。大小為2xN或者Nx2,這兒N是視圖中的所有點的數(shù)目。
dpdrot
可選參數(shù),關(guān)于旋轉(zhuǎn)向量部分的圖像上點的導(dǎo)數(shù),Nx3矩陣。
dpdt
可選參數(shù),關(guān)于平移向量部分的圖像上點的導(dǎo)數(shù),Nx3矩陣。
dpdf
可選參數(shù),關(guān)于fx和fy的圖像上點的導(dǎo)數(shù),Nx2矩陣。
dpdc
可選參數(shù),關(guān)于cx和cy的圖像上點的導(dǎo)數(shù),Nx2矩陣。
dpddist
可選參數(shù),關(guān)于形變系數(shù)的圖像上點的導(dǎo)數(shù),Nx4矩陣。

函數(shù)cvProjectPoints2通過給定的內(nèi)參數(shù)和外參數(shù)計算三維點投影到二維圖像平面上的坐標(biāo)。另外,這個函數(shù)可以計算關(guān)于投影參數(shù)的圖像 點偏導(dǎo)數(shù)的雅可比矩陣。雅可比矩陣可以用在cvCalibrateCamera2和cvFindExtrinsicCameraParams2函數(shù)的全局 優(yōu)化中。這個函數(shù)也可以用來計算內(nèi)參數(shù)和外參數(shù)的反投影誤差。 注意,將內(nèi)參數(shù)和(或)外參數(shù)設(shè)置為特定值,這個函數(shù)可以用來計算外變換(或內(nèi)變換)。

FindHomography

計算兩個平面之間的透視變換

void cvFindHomography( const CvMat* src_points,
                       const CvMat* dst_points,
                       CvMat* homography );
src_points
原始平面的點坐標(biāo),大小為2xN,Nx2,3xN或者 Nx3矩陣(后兩個表示齊次坐標(biāo)),這兒N表示點的數(shù)目。
dst_points
目標(biāo)平面的點坐標(biāo)大小為2xN,Nx2,3xN或者 Nx3矩陣(后兩個表示齊次坐標(biāo))。
homography
輸出的3x3的homography矩陣。

函數(shù)cvFindHomography計算源平面和目標(biāo)平面之間的透視變換H=\begin{bmatrix}h_{ij}\end{bmatrix}_{i,j}.

s_i \begin{bmatrix}x'_i \\ y'_i \\ 1\end{bmatrix}  \approx  H  \begin{bmatrix}x_i \\ y_i \\ 1\end{bmatrix}

使得反投影錯誤最小:

\sum_i((x'_i-\frac{h_{11}x_i + h_{12}y_i + h_{13}}{h_{31}x_i + h_{32}y_i + h_{33}})^2+          (y'_i-\frac{h_{21}x_i + h_{22}y_i + h_{23}}{h_{31}x_i + h_{32}y_i + h_{33}})^2)

這個函數(shù)可以用來計算初始的內(nèi)參數(shù)和外參數(shù)矩陣。由于Homography矩陣的尺度可變,所以它被規(guī)一化使得h33 = 1

CalibrateCamera2

利用定標(biāo)來計算攝像機的內(nèi)參數(shù)和外參數(shù)

void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points,
                         const CvMat* point_counts, CvSize image_size,
                         CvMat* intrinsic_matrix, CvMat* distortion_coeffs,
                         CvMat* rotation_vectors=NULL,
                         CvMat* translation_vectors=NULL,
                         int flags=0 );
object_points
定標(biāo)點的世界坐標(biāo),為3xN或者Nx3的矩陣,這里N是所有視圖中點的總數(shù)。
image_points
定標(biāo)點的圖像坐標(biāo),為2xN或者Nx2的矩陣,這里N是所有視圖中點的總數(shù)。
point_counts
向量,指定不同視圖里點的數(shù)目,1xM或者M(jìn)x1向量,M是視圖數(shù)目。
image_size
圖像大小,只用在初始化內(nèi)參數(shù)時。
intrinsic_matrix
輸出內(nèi)參矩陣(A) \begin{bmatrix}fx & 0 & cx\\ 0 & fy & cy \\ 0&0&1\end{bmatrix},如果指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部分或者全部必須被初始化。
distortion_coeffs
輸出大小為4x1或者1x4的向量,里面為形變參數(shù)[k1, k2, p1, p2]。
rotation_vectors
輸出大小為3xM或者M(jìn)x3的矩陣,里面為旋轉(zhuǎn)向量(旋轉(zhuǎn)矩陣的緊湊表示方式,具體參考函數(shù)cvRodrigues2)
translation_vectors
輸出大小為3xM或Mx3的矩陣,里面為平移向量。
flags
不同的標(biāo)志,可以是0,或者下面值的組合:
  • CV_CALIB_USE_INTRINSIC_GUESS - 內(nèi)參數(shù)矩陣包含fx,fy,cx和cy的初始值。否則,(cx, cy)被初始化到圖像中心(這兒用到圖像大小),焦距用最小平方差方式計算得到。注意,如果內(nèi)部參數(shù)已知,沒有必要使用這個函數(shù),使用 cvFindExtrinsicCameraParams2則可。
  • CV_CALIB_FIX_PRINCIPAL_POINT - 主點在全局優(yōu)化過程中不變,一直在中心位置或者在其他指定的位置(當(dāng)CV_CALIB_USE_INTRINSIC_GUESS設(shè)置的時候)。
  • CV_CALIB_FIX_ASPECT_RATIO - 優(yōu)化過程中認(rèn)為fx和fy中只有一個獨立變量,保持比例fx/fy不變,fx/fy的值跟內(nèi)參數(shù)矩陣初始化時的值一樣。在這種情況下, (fx, fy)的實際初始值或者從輸入內(nèi)存矩陣中讀?。ó?dāng)CV_CALIB_USE_INTRINSIC_GUESS被指定時),或者采用估計值(后者情況中fx 和fy可能被設(shè)置為任意值,只有比值被使用)。
  • CV_CALIB_ZERO_TANGENT_DIST – 切向形變參數(shù)(p1, p2)被設(shè)置為0,其值在優(yōu)化過程中保持為0。

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

FindExtrinsicCameraParams2

計算指定視圖的攝像機外參數(shù)

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
定標(biāo)點的坐標(biāo),為3xN或者Nx3的矩陣,這里N是視圖中的個數(shù)。
image_points
定標(biāo)點在圖像內(nèi)的坐標(biāo),為2xN或者Nx2的矩陣,這里N是視圖中的個數(shù)。
intrinsic_matrix
內(nèi)參矩陣(A) \begin{bmatrix}fx & 0 & cx\\ 0 & fy & cy \\ 0&0&1\end{bmatrix}。
distortion_coeffs
大小為4x1或者1x4的向量,里面為形變參數(shù)[k1,k2,p1,p2]。如果是NULL,所有的形變系數(shù)都為0。
rotation_vector
輸出大小為3x1或者1x3的矩陣,里面為旋轉(zhuǎn)向量(旋轉(zhuǎn)矩陣的緊湊表示方式,具體參考函數(shù)cvRodrigues2)。
translation_vector
大小為3x1或1x3的矩陣,里面為平移向量。

函數(shù)cvFindExtrinsicCameraParams2使用已知的內(nèi)參數(shù)和某個視圖的外參數(shù)來估計相機的外參數(shù)。3維物體上的點坐標(biāo)和相應(yīng)的2維投影必須被指定。這個函數(shù)也可以用來最小化反投影誤差。

Rodrigues2

進(jìn)行旋轉(zhuǎn)矩陣和旋轉(zhuǎn)向量間的轉(zhuǎn)換

int  cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );
src
輸入的旋轉(zhuǎn)向量(3x1或者1x3)或者旋轉(zhuǎn)矩陣(3x3)。
dst
輸出的旋轉(zhuǎn)矩陣(3x3)或者旋轉(zhuǎn)向量(3x1或者1x3)
jacobian
可選的輸出雅可比矩陣(3x9或者9x3),關(guān)于輸入部分的輸出數(shù)組的偏導(dǎo)數(shù)。

函數(shù)轉(zhuǎn)換旋轉(zhuǎn)向量到旋轉(zhuǎn)矩陣,或者相反。旋轉(zhuǎn)向量是旋轉(zhuǎn)矩陣的緊湊表示形式。旋轉(zhuǎn)向量的方向是旋轉(zhuǎn)軸,向量的長度是圍繞旋轉(zhuǎn)軸的旋轉(zhuǎn)角。旋轉(zhuǎn)矩陣R,與其對應(yīng)的旋轉(zhuǎn)向量r,通過下面公式轉(zhuǎn)換:

\theta \leftarrow norm(r)

r \leftarrow r/\theta

R = \cos(\theta)I + (1-\cos(\theta))rr^T + \sin(\theta) \begin{bmatrix}0&-r_z&r_y\\ r_z&0&-r_x\\ -r_y&r_x&0\end{bmatrix}

反變換也可以很容易的通過如下公式實現(xiàn):

\sin(\theta) \begin{bmatrix}0&-r_z&r_y\\ r_z&0&-r_x\\ -r_y&r_x&0\end{bmatrix} = \frac{R-R^T}{2}

旋轉(zhuǎn)向量是只有3個自由度的旋轉(zhuǎn)矩陣一個方便的表示,這種表示方式被用在函數(shù)cvFindExtrinsicCameraParams2和cvCalibrateCamera2內(nèi)部的全局最優(yōu)化中。

Undistort2

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

void cvUndistort2( const CvArr* src, CvArr* dst,
                   const CvMat* intrinsic_matrix,
                   const CvMat* distortion_coeffs );
src
原始圖像(已經(jīng)變形的圖像)。只能變換32fC1的圖像。
dst
結(jié)果圖像(已經(jīng)校正的圖像)。
intrinsic_matrix
相機內(nèi)參數(shù)矩陣,格式為 \begin{bmatrix}fx & 0 & cx\\ 0 & fy & cy\\ 0&0&1\end{bmatrix}。
distortion_coeffs
四個變形系數(shù)組成的向量,大小為4x1或者1x4,格式為[k1,k2,p1,p2]。

函數(shù)cvUndistort2對圖像進(jìn)行變換來抵消徑向和切向鏡頭變形。相機參數(shù)和變形參數(shù)可以通過函數(shù)cvCalibrateCamera2取 得。使用本節(jié)開始時提到的公式,對每個輸出圖像像素計算其在輸入圖像中的位置,然后輸出圖像的像素值通過雙線性插值來計算。如果圖像得分辨率跟定標(biāo)時用得 圖像分辨率不一樣,fx、fy、cx和cy需要相應(yīng)調(diào)整,因為形變并沒有變化。

InitUndistortMap

計算形變和非形變圖像的對應(yīng)(map)

void cvInitUndistortMap( const CvMat* intrinsic_matrix,
                         const CvMat* distortion_coeffs,
                         CvArr* mapx, CvArr* mapy );
intrinsic_matrix
攝像機內(nèi)參數(shù)矩陣(A) [fx 0 cx; 0 fy cy; 0 0 1].
distortion_coeffs
形變系數(shù)向量[k1, k2, p1, p2],大小為4x1或者1x4。
mapx
x坐標(biāo)的對應(yīng)矩陣。
mapy
y坐標(biāo)的對應(yīng)矩陣。

函數(shù)cvInitUndistortMap預(yù)先計算非形變對應(yīng)-正確圖像的每個像素在形變圖像里的坐標(biāo)。這個對應(yīng)可以傳遞給cvRemap函數(shù)(跟輸入和輸出圖像一起)。

FindChessboardCorners

尋找棋盤圖的內(nèi)角點位置

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
棋盤圖中每行和每列角點的個數(shù)。
corners
檢測到的角點
corner_count
輸出,角點的個數(shù)。如果不是NULL,函數(shù)將檢測到的角點的個數(shù)存儲于此變量。
flags
各種操作標(biāo)志,可以是0或者下面值的組合:
  • CV_CALIB_CB_ADAPTIVE_THRESH - 使用自適應(yīng)閾值(通過平均圖像亮度計算得到)將圖像轉(zhuǎn)換為黑白圖,而不是一個固定的閾值。
  • CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定閾值或者自適應(yīng)的閾值進(jìn)行二值化之前,先使用cvNormalizeHist來均衡化圖像亮度。
  • CV_CALIB_CB_FILTER_QUADS - 使用其他的準(zhǔn)則(如輪廓面積,周長,方形形狀)來去除在輪廓檢測階段檢測到的錯誤方塊。

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

DrawChessBoardCorners

繪制檢測到的棋盤角點

void cvDrawChessboardCorners( CvArr* image, CvSize pattern_size,
                              CvPoint2D32f* corners, int count,
                              int pattern_was_found );
image
結(jié)果圖像,必須是8位彩色圖像。
pattern_size
每行和每列地內(nèi)角點數(shù)目。
corners
檢測到地角點數(shù)組。
count
角點數(shù)目。
pattern_was_found
指示完整地棋盤被發(fā)現(xiàn)(≠0)還是沒有發(fā)現(xiàn)(=0)??梢詡鬏攃vFindChessboardCorners函數(shù)的返回值。

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

姿態(tài)估計

CreatePOSITObject

初始化包含對象信息的結(jié)構(gòu)

CvPOSITObject* cvCreatePOSITObject( CvPoint3D32f* points, int point_count );
points
指向三維對象模型的指針
point_count
對象的點數(shù)

函數(shù) cvCreatePOSITObject 為對象結(jié)構(gòu)分配內(nèi)存并計算對象的逆矩陣。

預(yù)處理的對象數(shù)據(jù)存儲在結(jié)構(gòu)CvPOSITObject中,只能在OpenCV內(nèi)部被調(diào)用,即用戶不能直接讀寫數(shù)據(jù)結(jié)構(gòu)。用戶只可以創(chuàng)建這個結(jié)構(gòu)并將指針傳遞給函數(shù)。

對象是在某坐標(biāo)系內(nèi)的一系列點的集合,函數(shù) cvPOSIT計算從照相機坐標(biāo)系中心到目標(biāo)點points[0] 之間的向量。

一旦完成對給定對象的所有操作,必須使用函數(shù)cvReleasePOSITObject釋放內(nèi)存。

POSIT

執(zhí)行POSIT算法

void cvPOSIT( CvPOSITObject* posit_object, CvPoint2D32f* image_points, 
              double focal_length,
              CvTermCriteria criteria, CvMatr32f rotation_matrix, 
              CvVect32f translation_vector );
posit_object
指向?qū)ο蠼Y(jié)構(gòu)的指針
image_points
指針,指向目標(biāo)像素點在二維平面圖上的投影。
focal_length
使用的攝像機的焦距
criteria
POSIT迭代算法程序終止的條件
rotation_matrix
旋轉(zhuǎn)矩陣
translation_vector
平移矩陣.

函數(shù) cvPOSIT 執(zhí)行POSIT算法。圖像坐標(biāo)在攝像機坐標(biāo)系統(tǒng)中給出。焦距可以通過攝像機標(biāo)定得到。算法每一次迭代都會重新計算在估計位置的透視投影。

兩次投影之間的范式差值是對應(yīng)點中的最大距離。如果差值過小,參數(shù)criteria.epsilon就會終止程序。

ReleasePOSITObject

釋放3D對象結(jié)構(gòu)

void cvReleasePOSITObject( CvPOSITObject** posit_object );
posit_object
指向 CvPOSIT 結(jié)構(gòu)指針的指針。

函數(shù) cvReleasePOSITObject 釋放函數(shù) cvCreatePOSITObject分配的內(nèi)存。

CalcImageHomography

計算長方形或橢圓形平面對象(例如胳膊)的Homography矩陣

void cvCalcImageHomography( float* line, CvPoint3D32f* center,
                            float* intrinsic, float* homography );
line
對象的主要軸方向,為向量(dx,dy,dz).
center
對象坐標(biāo)中心 ((cx,cy,cz)).
intrinsic
攝像機內(nèi)參數(shù) (3x3 matrix).
homography
輸出的Homography矩陣(3x3).

函數(shù) cvCalcImageHomography 為從圖像平面到圖像平面的初始圖像變化(defined by 3D oblong object line)計算Homography矩陣。

對極幾何(雙視幾何)

FindFundamentalMat

由兩幅圖像中對應(yīng)點計算出基本矩陣

int cvFindFundamentalMat( const CvMat* points1,
                          const CvMat* points2,
                          CvMat* fundamental_matrix,
                          int    method=CV_FM_RANSAC,
                          double param1=1.,
                          double param2=0.99,
                          CvMat* status=NULL);
points1
第一幅圖像點的數(shù)組,大小為2xN/Nx2 或 3xN/Nx3 (N 點的個數(shù)),多通道的1xN或Nx1也可以。點坐標(biāo)應(yīng)該是浮點數(shù)(雙精度或單精度)。:
points2
第二副圖像的點的數(shù)組,格式、大小與第一幅圖像相同。
fundamental_matrix
輸出的基本矩陣。大小是 3x3 或者 9x3 ,(7-點法最多可返回三個矩陣).
method
計算基本矩陣的方法
  • CV_FM_7POINT – 7-點算法,點數(shù)目= 7
  • CV_FM_8POINT – 8-點算法,點數(shù)目 >= 8
  • CV_FM_RANSAC – RANSAC 算法,點數(shù)目 >= 8
  • CV_FM_LMEDS - LMedS 算法,點數(shù)目 >= 8
param1
這個參數(shù)只用于方法RANSAC 或 LMedS 。它是點到對極線的最大距離,超過這個值的點將被舍棄,不用于后面的計算。通常這個值的設(shè)定是0.5 or 1.0 。
param2
這個參數(shù)只用于方法RANSAC 或 LMedS 。 它表示矩陣正確的可信度。例如可以被設(shè)為0.99 。
status
具有N個元素的輸出數(shù)組,在計算過程中沒有被舍棄的點,元素被被置為1;否則置為0。這個數(shù)組只可以在方法RANSAC and LMedS 情況下使用;在其它方法的情況下,status一律被置為1。這個參數(shù)是可選參數(shù)。

對極幾何可以用下面的等式描述:

p_2^T \cdot F \cdot p_1=0

其中 F 是基本矩陣,p1p2 分別是兩幅圖上的對應(yīng)點。

函數(shù) FindFundamentalMat 利用上面列出的四種方法之一計算基本矩陣,并返回基本矩陣的值:沒有找到矩陣,返回0,找到一個矩陣返回1,多個矩陣返回3。 計算出的基本矩陣可以傳遞給函數(shù)cvComputeCorrespondEpilines來計算指定點的對極線。

例子1:使用 RANSAC 算法估算基本矩陣。
int    numPoints = 100;
CvMat* points1;
CvMat* points2;
CvMat* status;
CvMat* fundMatr;
points1 = cvCreateMat(2,numPoints,CV_32F);
points2 = cvCreateMat(2,numPoints,CV_32F);
status  = cvCreateMat(1,numPoints,CV_32F);

/* 在這里裝入對應(yīng)點的數(shù)據(jù)... */

fundMatr = cvCreateMat(3,3,CV_32F);
int num = cvFindFundamentalMat(points1,points2,fundMatr,CV_FM_RANSAC,1.0,0.99,status);
if( num == 1 )
     printf("Fundamental matrix was found\n");
else
     printf("Fundamental matrix was not found\n");


例子2:7點算法(3個矩陣)的情況。
CvMat* points1;
CvMat* points2;
CvMat* fundMatr;
points1 = cvCreateMat(2,7,CV_32F);
points2 = cvCreateMat(2,7,CV_32F);

/* 在這里裝入對應(yīng)點的數(shù)據(jù)... */

fundMatr = cvCreateMat(9,3,CV_32F);
int num = cvFindFundamentalMat(points1,points2,fundMatr,CV_FM_7POINT,0,0,0);
printf("Found %d matrixes\n",num);

ComputeCorrespondEpilines

為一幅圖像中的點計算其在另一幅圖像中對應(yīng)的對極線。

void cvComputeCorrespondEpilines( const CvMat* points,
                                  int which_image,
                                  const CvMat* fundamental_matrix,
                                  CvMat* correspondent_lines);
points
輸入點,是2xN 或者 3xN 數(shù)組 (N為點的個數(shù))
which_image
包含點的圖像指數(shù)(1 or 2)
fundamental_matrix
基本矩陣
correspondent_lines
計算對極點, 3xN數(shù)組

函數(shù) ComputeCorrespondEpilines 根據(jù)外級線幾何的基本方程計算每個輸入點的對應(yīng)外級線。如果點位于第一幅圖像(which_image=1),對應(yīng)的對極線可以如下計算 :

l_2=F \cdot p_1

其中F是基本矩陣,p1 是第一幅圖像中的點, l2 - 是與第二幅對應(yīng)的對極線。如果點位于第二副圖像中 which_image=2),計算如下:

l_1=F^T \cdot p_2

其中p2 是第二幅圖像中的點,l1 是對應(yīng)于第一幅圖像的對極線,每條對極線都可以用三個系數(shù)表示 a, b, c:

a\cdot x + b\cdot y + c = 0

歸一化后的對極線系數(shù)存儲在correspondent_lines 中。

ConvertPointsHomogenious

Convert points to/from homogenious coordinates

void cvConvertPointsHomogenious( const CvMat* src, CvMat* dst );
src
The input point array, 2xN, Nx2, 3xN, Nx3, 4xN or Nx4 (where N is the number of points). Multi-channel 1xN or Nx1 array is also acceptable.
dst
The output point array, must contain the same number of points as the input; The dimensionality must be the same, 1 less or 1 more than the input, and also within 2..4.

The function cvConvertPointsHomogenious converts 2D or 3D points from/to homogenious coordinates, or simply copies or transposes the array. In case if the input array dimensionality is larger than the output, each point coordinates are divided by the last coordinate:

(x,y[,z],w) -> (x',y'[,z'])
其中
x' = x/w
y' = y/w
z' = z/w (if output is 3D)

If the output array dimensionality is larger, an extra 1 is appended to each point.

(x,y[,z]) -> (x,y[,z],1)

Otherwise, the input array is simply copied (with optional tranposition) to the output. Note that, because the function accepts a large variety of array layouts, it may report an error when input/output array dimensionality is ambiguous. It is always safe to use the function with number of points N>=5, or to use multi-channel Nx1 or 1xN arrays.



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多