【问题标题】:Homographie Opencv apply in OpenglHomographie Opencv 在 Opengl 中的应用
【发布时间】:2023-03-06 15:39:01
【问题描述】:

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

glMultMatrixf(HomoGl);

应用此转换。为了填充 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

【问题讨论】:

    标签: c++ opencv opengl homography


    【解决方案1】:

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

     X1 = H*X2
    

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

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

    【讨论】:

    • @ilt 哈哈!惊人的。如果它是您要查找的内容,请不要忘记单击复选框(在向上箭头下方):)
    【解决方案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      
    

    这种方法的问题在于,虽然它为xy 提供了正确的结果,但它会扭曲z,因为修改后的w 组件会影响所有坐标。如果 z 坐标很重要,您需要一种不同的方法。

    this paper 中,提出了一个近似值,它将最小化对深度的影响(请参见等式 5,您还需要对单应性进行归一化以便h33=1)。然而,这种近似只适用于小的失真。如果你有一些极端的梯形失真,那么这个方法也会失败。在这种情况下,可以使用 2 次渲染到纹理并应用 2D 失真的方法。

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

    【讨论】:

    • 你有任何着色器方法的代码示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多