2

假设我有这个图像,其中是一个对象(一个立方体)。该对象正在被跟踪(带有标签),我设法在其上渲染一个虚拟立方体(增强现实)。现在我可以在其上渲染一个虚拟立方体,我希望能够使用一些称为“修复”的非常基本的减少现实技术使对象“消失”。有问题的修复非常简单(必须如此,否则 FPS 会受到影响),它需要我对像素及其邻居进行一些操作(如高斯模糊或其他基本图像处理)。

为此,我首先需要:

  1. 面具:黑色背景,里面有一个白色立方体。
  2. 访问初始图像的每个像素(在坐标 x 和 y 处)及其邻域,并根据掩码在相同 x 和 y 坐标处的像素值进行处理。所以基本上掩码是一种表示忽略这个像素或使用这个像素的方式。

如何使用 OpenGL 执行此操作?由于邻居,我希望能够以 2D 方式逐个访问像素值。

我使用 FBO 还是 PBO?我已经阅读了很多关于缓冲区和方法的内容,glDrawPixels()但我无法将它们全部放在一起。我看到这种方法的论文使用了GL_BACK缓冲区,但我的已经使用了。由于我仍然是 OpenGL 的初学者,因此对于所有形式(OpenG` 调用)都会非常感激一些示例代码(C++)。

如果像素操作在 OpenGL 中太难,我什至考虑使用 OpenCV,因为我的 AR 库(Aruco)在 OpenCV 之上工作。在这种情况下,我仍然需要获取蒙版(黑色背景上的白色立方体),将其转换为 acv::Mat然后进行处理。

我知道这种方法效率低下(从 GPU/CPU 来回切换),但我的目标(目前)是至少让基础工作正常。

4

1 回答 1

2

设置一个帧缓冲区对象来渲染您的原始图像 + 虚拟立方体。这是一个教程

接下来,您可以将该帧缓冲区纹理附加为下一阶段的输入(采样器)纹理,并渲染覆盖您的遮罩的四边形(两个三角形)。

在片段着色器中,您应该能够通过读取变量 gl_FragCoord 来对“屏幕坐标”进行采样。将纹理过滤器功能设置为 GL_NEAREST,您可以访问精确的纹理坐标。相邻像素也可以使用位移(deltaX = 2/Width,deltaY=2/Height)。

必须使用以前的帧缓冲区纹理作为源,因为当前活动的帧缓冲区是只写的。

于 2012-12-24T08:25:27.300 回答