2016-08-03 96 views
-1

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

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

更确切地说,我有一个iOS应用程序,我流式摄像机的颜色。这个流在我的Ipad上用OpenGL显示。在这个显示屏上,我有一个特定的覆盖图,它是一个3D对象。同时,我用OpenCV做了一些检测。现在,我想将我的检测结果链接到我的框架(这是一个矩形绘图),感谢OpenCV与3D对象,但对于这一个,我只有它的相机位置和尺寸。

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

那么简单: 输入:2D矩形(仅获得2D坐标)和三维物体(只得到它的摄像头位置)

有没有办法?你可以帮我吗 ?

感谢

+0

您是否希望获得由矩阵表示的像素或由矢量乘以矩阵表示的像素?解释你的输入究竟是什么。 –

+0

我刚刚编辑过我的帖子。其实是的,我想从我的相机姿态(矩阵4x4)我的3D对象的二维坐标(像素)。感谢马蒂奇。 – lilouch

+0

这是最初发布在[Robotics](http://stackoverflow.com/q/38763529/42473)上的,但在此处双张贴后迁移。 –

回答

1

为了让你只需要通过您正在使用的openGL的矩阵乘以它的向量的屏幕上投影。第三个坐标简单地被丢弃,仅用于深度缓冲区(也可以是插值,但在这里确实无关紧要)。

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

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

+0

不要忘记检查坐标是否实际在缓冲区内... –

+0

感谢您的回复,但我只有对象的相机位置,就是这样。那么我需要分解这个相机位置吗? – lilouch

+0

如果我理解正确,那么只需要将零向量与矩阵相乘。或者你可能只需要矩阵(第四行)的变换向量并将其用作结果。 –

1

由于您已经在使用GLKit类型和数学,因此如果还需要另一种方法,请尝试使用函数GLKMathProject将3D模型空间转换为视口(窗口/像素2D)空间,然后使用GLKMathUnproject。你需要(相同的)模型视图和投影矩阵,你可以(假设)传递给着色器来绘制场景。