【问题标题】:Pixel manipulation in OpenGLOpenGL中的像素操作
【发布时间】:2012-12-24 07:48:17
【问题描述】:

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

为此,我首先需要:

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

我如何使用 OpenGL 来做到这一点?由于邻居,我希望能够以 1×1 的方式访问像素值,最好是在 2D 中。

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

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

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

【问题讨论】:

    标签: c++ opengl image-processing opencv augmented-reality


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我会尝试让它以这种方式工作,并在我完成后或者如果我失去战斗特工的时间后报告。
    • 实际上,我的原始“帧”(来自相机或视频)存储在cv::Mat 中,因此我可以制作一个 FBO,将图像放入其中,再制作一个 FBO,将黑色背景放入并渲染白色的虚拟立方体。使用掩码FBO作为掩码修改第一个FBO(inpaint),最后复制到主缓冲区。
    猜你喜欢
    • 2017-09-29
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多