OpenGL中的像素操作

Pixel manipulation in OpenGL

本文关键字:操作 像素 OpenGL      更新时间:2023-10-16

假设我有这张图片,里面有一个物体(一个立方体)。该对象正在被跟踪(带有标签),我设法在其上渲染一个虚拟立方体(增强现实)。现在我可以在上面渲染一个虚拟的立方体,我想用一些基本的被称为"inpainting"的淡化现实技术让物体"消失"。问题中的inpaint非常简单(它必须如此,否则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),但我的目标(目前)是至少使基本工作

设置一个framebuffer对象来呈现原始图像+虚拟多维数据集。这是一个教程。

接下来,你可以将framebuffer纹理附加为下一阶段的输入(采样器)纹理,并渲染一个覆盖蒙版的四边形(两个三角形)。

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

使用以前的framebuffer纹理作为源是强制性的,因为当前活动的framebuffer只能写