Opencv在Opengl中的应用

Homographie Opencv apply in Opengl

本文关键字:应用 Opengl Opencv      更新时间:2023-10-16

我将一个算法修改为rectif。它返回2个Opencv单形图(3x3矩阵)。我可以使用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同态,以便使用glMultMatrixf来获得正确变换的图像。

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

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

 X1 = H*X2

当您在opencv中使用warpHomography时,您将点放置在平面2的感知中。

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

您将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坐标很重要,则需要一种不同的方法。

在本文中,提出了一种近似,该近似将最小化对深度的影响(见方程5,您还需要归一化单应性,以使h33=1)。然而,这种近似只适用于较小的失真。如果你有一些极端的梯形失真,这种方法也会失败。在这种情况下,渲染到纹理中并应用2D失真的两遍方法是可能的。

使用现代可编程流水线,也可以通过在片段着色器中取消z坐标的扭曲来一次性处理此问题(但这本身可能会对性能产生一些负面影响)。