C++ Opencv在Opengl中的应用
我修改了一个算法来校正。它返回2个Opencv同音字3x3矩阵。我可以使用cv::warpPerspective并获得校正后的图像。所以算法是正确的。但我需要在OpenGl中将同形图应用于纹理。因此,我创建了一个4x4矩阵HomoGl,并使用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&
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!令人惊叹的如果您正在查找,请不要忘记单击上下箭头下的复选框:是否有着色器方法的代码示例?