2014-09-19 168 views
1

我修改了一個算法來糾正。它返回2個Opencv單應性(3x3矩陣)。我可以使用cv :: warpPerspective並獲得更正的圖像。所以這個算法是正確的。但是我需要將這些單應用應用於OpenGl中的紋理。所以我創建了一個4x4矩陣(HomoGl),我使用Homographie Opencv適用於Opengl

glMultMatrixf(HomoGl); 

來應用這個Tranform。要填補我使用的HomoGl

for(int i=0;i<3;++i){ 
    for(int j=0; j<3;++j){ 
     HomoGL[i+j*4] = HomoCV.at<double>(i,j); 
    } 
} 

此方法有最好的結果......但它是錯誤的。我測試了其他一些方法[1],但它們不起作用。

我的問題:我該如何轉換OpenCV的Homography,所以我可以使用glMultMatrixf來獲得正確的變形圖像 。

[1] http://www.aiqus.com/questions/24699/from-2d-homography-of-2-planes-to-3d-rotation-of-opengl-camera

回答

0

因此,一個H矩陣是1點的平面上的一個變換到另一個點上平面2

X1 = H*X2 

當你在OpenCV中使用warpHomography你是把點在平面2的感知中。

您從中獲得的矩陣(或圖像墊)warping是應用於表面時應使用的紋理。

+0

謝謝你。顯而易見的想法很好用;)。 – ilt 2014-09-20 13:26:22

+0

@ilt哈哈!真棒。不要忘了點擊複選框(在updown箭頭下),如果它是你正在尋找的東西:) – Jay 2014-09-22 17:51:53

0

您將3x3單應矩陣擴展爲4x4是錯誤的。最幼稚的做法,這將有些工作會形式的延伸

 h11 h12 h13    h11 h12 0 h13 
H = h21 h22 h23 -> H' = h21 h22 0 h23 
    h31 h32 h32    0 0 1 0 
          h31 h32 0 h33  

這種方法的問題是,雖然它給出了xy正確的結果,它會扭曲z,因爲修改w組件影響所有座標。如果z座標很重要,則需要採用不同的方法。

this paper中,提出了一種近似方法,它可以將對深度的影響降至最低(請參見公式5,您還需要對單應矩陣進行歸一化處理,以便h33=1)。但是,這種近似只適用於小的扭曲。如果你有一些極端的梯形失真,那種接近也會失敗。在這種情況下,渲染到紋理中並應用2D畸變的2遍方法是可能的。

對於現代可編程流水線,人們可以通過不破壞片段着色器中的z座標(但它本身可能會對性能產生一些負面影響)來處理此問題。

+0

你有着色器方法的任何代碼示例嗎? – aledalgrande 2014-10-02 18:03:22