Homographie Opencv适用于Opengl

时间:2014-09-19 17:25:52

标签: c++ opencv opengl homography

我修改了一个算法来纠正。它返回2个Opencv单应性(3x3 Matrixes)。我可以使用cv :: warpPerspective并获得纠正后的图像。所以算法工作正常。但我需要将这些单应性应用于OpenGl中的纹理。所以我创建了一个4x4矩阵(HomoGl)并使用

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

2 个答案:

答案 0 :(得分:0)

所以H矩阵是平面1上1点到平面2上另一点的变换。

 X1 = H*X2

当您在opencv中使用warpHomography时,您会将这些点放在平面2的感知范围内。

warping获得的矩阵(或图像垫)是应用于曲面时应使用的纹理。

答案 1 :(得分: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)。但是,这种近似只适用于小的失真。如果你有一些极端的梯形失真,那个approch也会失败。在这种情况下,可以采用2遍渲染纹理并应用2D失真。

使用现代可编程管道,人们也可以通过对片段着色器中的z坐标进行无失真来一次性处理(但这会对性能产生一些负面影响)。