OpenGL ES - 从摄像机位置

时间:2016-08-03 07:46:30

标签: c++ ios objective-c opencv opengl-es

我正在使用OpenGL ES(IOS)和OpenCV。我想知道是否有办法从GLKMatrix4相机位置获取2D像素坐标?

实际上,我有一个用OpenGL显示的特定3D对象,它只有它的大小和相机姿势,我想把它转换成OpenCV参考坐标,即2D像素。

更确切地说,我有一个IOS应用程序,我流式传输相机颜色。在我的Ipad上使用OpenGL显示此流。在这个显示器上,我有一个特定的叠加层,它是一个3D对象。同时,我用OpenCV做了一些检测。现在,我想将我的检测结果感谢我的框架中的OpenCV(它是一个矩形绘图)和3D对象,但对于这个,我只有它的相机位置和它的大小。

我知道4x4相机姿势的内容,但我没有找到任何关于如何将其转换(如果可能)到2D坐标的信息。

如此简短: 输入:2D矩形(仅获取2D坐标)和3D对象(仅获取其摄像机位置)

有办法吗?你能帮我吗?

感谢

2 个答案:

答案 0 :(得分:1)

要获得矢量的屏幕投影,您只需将其乘以您在openGL中使用的矩阵。第3个坐标被简单地丢弃,仅用于深度缓冲区(也是插值,但这里确实无关紧要。)

在openGL中,通过将其与矩阵相乘得到的绘制像素的坐标将被标准化为所有轴中范围[-1,1]的坐标系。这意味着屏幕/视图最左上角的像素将具有坐标(-1,1),右上角(1,1),中心(0,0) ...现在对应于缓冲区像素这个值必须非规范化:

您需要拥有缓冲区widthheight,因此像素位置为bufferX = ((x+1)/2.0) * widthbufferY = ((y+1)/2.0) * height。结果是浮点值,因此您需要将它们舍入为整数或对它们进行类型转换。我不知道openGL是做了哪些。

答案 1 :(得分:1)

由于您已经在使用GLKit类型和数学,请尝试使用函数GLKMathProject将3D模型空间转换为视口(窗口/像素2D)空间,如果还需要其他空间,请尝试GLKMathUnproject四处走走。您需要(相同的)模型视图和投影矩阵(大概)传递到着色器以绘制场景。