C++ Opencv在Opengl中的应用

C++ Opencv在Opengl中的应用,c++,opencv,opengl,homography,C++,Opencv,Opengl,Homography,我修改了一个算法来校正。它返回2个Opencv同音字3x3矩阵。我可以使用cv::warpPerspective并获得校正后的图像。所以算法是正确的。但我需要在OpenGl中将同形图应用于纹理。因此,我创建了一个4x4矩阵HomoGl,并使用 glMultMatrixf(HomoGl); 应用此转换。要填充我使用的 for(int i=0;i<3;++i){ for(int j=0; j<3;++j){ HomoGL[i+j*4] = HomoCV.at&

我修改了一个算法来校正。它返回2个Opencv同音字3x3矩阵。我可以使用cv::warpPerspective并获得校正后的图像。所以算法是正确的。但我需要在OpenGl中将同形图应用于纹理。因此,我创建了一个4x4矩阵HomoGl,并使用

glMultMatrixf(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] 所以H矩阵是平面上一点到平面2上另一点的变换

 X1 = H*X2
在opencv中使用单应时,将点放置在平面2的感知中


从扭曲中获得的矩阵或图像垫是应用于曲面时应使用的纹理。

将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      
这种方法的问题是,虽然它给出了x和y的正确结果,但它会扭曲z,因为修改后的w分量会影响所有坐标。如果z坐标很重要,则需要另一种方法

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


使用现代可编程管道,还可以通过在片段着色器中不失真z坐标一次性处理此问题,但这本身会对性能产生一些负面影响。

@ilt Haha!令人惊叹的如果您正在查找,请不要忘记单击上下箭头下的复选框:是否有着色器方法的代码示例?