2012-02-14 40 views
14

我正在使用OpenCV計算的單應性。我目前使用這種單應性來使用下面的函數來轉換點。這個函數執行我所需要的任務,但是我不知道它是如何工作的。OpenCV Homography,轉換一個觀點,這段代碼在做什麼?

誰能解釋,一行行正好,最後3行代碼背後的邏輯/理論,據我所知,這些將點x,y,但我不清楚爲什麼這個工程:

爲什麼Z,pxpy這樣計算,h中的元素對應什麼?

您的意見是極大的讚賞:)

double h[9]; 
homography = cvMat(3, 3, CV_64F, h); 
CvMat ps1 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points1); 
CvMat ps2 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points2); 

cvFindHomography(&ps1, &ps2, &homography, 0); 

... 

// This is the part I don't fully understand 
double x = 10.0; 
double y = 10.0; 
double Z = 1./(h[6]*x + h[7]*y + h[8]); 
px = (int)((h[0]*x + h[1]*y + h[2])*Z); 
py = (int)((h[3]*x + h[4]*y + h[5])*Z); 

回答

28

cvFindHomography()返回使用homogenous coordinates矩陣:

齊次座標在計算機圖形無處不在的,因爲它們允許普通操作,如平移,旋轉,縮放和透視投影作爲矩陣運算實施

代碼中發生了什麼: 將笛卡爾點p_origin_cartesian(x,y)轉換爲均勻座標,然後應用3x3透視變換矩陣h,並將結果轉換回笛卡爾座標p_transformed_cartesian(px,py)

UPDATE

詳細:

轉換p_origin_cartesianp_origin_homogenous

(x,y) => (x,y,1) 

做透視變換:

p_transformed_homogenous = h * p_origin_homogenous = 

(h0,h1,h2) (x) (h0*x + h1*y + h2) (tx) 
(h3,h4,h5) * (y) = (h3*x + h4*y + h5) = (ty) 
(h6,h7,h8) (1) (h6*x + h7*y + h8) (tz) 

轉換p_transformed_homogenousp_transformed_cartesian

(tx,ty,tz) => (tx/tz, ty/tz) 

您的代碼翻譯:

px = tx/tz; 
py = ty/tz; 
Z = 1/tz; 
+0

您好,感謝您的意見,到目前爲止,還等什麼是Z-做什麼? – Jayson 2012-02-14 11:20:17

+0

z是三維同質座標系中的第3個座標。 解釋同調座標的工作原理在這裏將會過分。但是p_homogenous(x,y,z)對應於p_cartesian(x/z,y/z)。 – Ben 2012-02-14 12:11:36

+0

ahhh謝謝,現在開始有意義。 – Jayson 2012-02-14 12:39:03

0

OpenCV的Python實現以下@Ben回答

p = np.array((x,y,1)).reshape((3,1)) 
temp_p = M.dot(p) 
sum = np.sum(temp_p ,1) 
px = int(round(sum[0]/sum[2])) 
py = int(round(sum[1]/sum[2]))