Opencv在Opengl中的应用
Homographie Opencv apply in Opengl
我将一个算法修改为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
这种方法的问题是,虽然它给出了x
和y
的正确结果,但它会使z
失真,因为修改后的w
分量会影响所有坐标。如果z坐标很重要,则需要一种不同的方法。
在本文中,提出了一种近似,该近似将最小化对深度的影响(见方程5,您还需要归一化单应性,以使h33=1
)。然而,这种近似只适用于较小的失真。如果你有一些极端的梯形失真,这种方法也会失败。在这种情况下,渲染到纹理中并应用2D失真的两遍方法是可能的。
使用现代可编程流水线,也可以通过在片段着色器中取消z
坐标的扭曲来一次性处理此问题(但这本身可能会对性能产生一些负面影响)。
- 在 OpenGL 中转换应用顺序让我感到困惑
- OpenGL GLFW 应用程序 - 客户端内存限制
- 如何在OpenGL中将纹理应用于子网格
- 从OpenGL应用程序中提取颜色/深度缓冲区
- OpenGL应用程序在不同的计算机上的工作方式不同
- opengl 飞行模拟器应用程序中的文本呈现问题
- OpenGL 应用程序退出,退出代码为 -1073741515 (0xC0000135)
- 如何在WinAPI应用程序中集成OpenGL和GLU?
- 如何为 QtQuick 应用程序选择 OpenGL 上下文
- 在通用Windows应用程序中使用OpenGL,角度:glLoadIdentity和glOrtho undefined
- 在Linux终端上使用C 编制示例OpenGL应用程序
- OpenGL应用程序导致d3d11.dll中的堆栈溢出
- 在同一应用程序中使用传统OpenGL和现代OpenGL
- 在Windows?上编译Linux OpenGL应用程序
- 如何使用Visual Studio创建OpenGL 3应用程序
- 在Linux上编写OpenGL 4.X应用程序的常用库是什么?
- QT 4.x/5.x和OpenGL用于桌面GUI应用程序:选择哪种模块
- 在 opengl 中应用转换函数后未显示对象
- 带有OpenGL和嵌入式WebViews的本机移动应用程序(iOS/Android)的测试框架
- 使用注入的DLL从外部应用程序中渲染OpenGL场景