我需要一个函数将这些扭曲的图像转换为具有均匀像素大小的平面图像。我已经通过CPU完成了这项工作,但我想尝试使用OpenGL来以便携的方式使用GPU进行处理。
对于OpenGL编程,我没有任何经验,并且我在网络上找到的大部分信息都对此无帮助。我该如何继续呢?我该如何做到这一点呢?
图像大小为560 x 860像素,我们有720个图像批次需要处理。我使用的操作系统是Ubuntu。
OpenGL用于渲染多边形。您可能需要多次通过使用着色器来实现所需效果,但最好还是在OpenCL中重新编写算法。这样的好处是,即使没有图形加速卡,它也可以使用多核CPU,并且具有可移植性。
如果您想使用OpengGL完成这个任务,通常会将当前数据作为纹理提供,并编写一个处理该数据的片段着色器,并设置它以渲染到纹理。一旦输出纹理完全渲染,您就可以将其检索回CPU并将其作为文件写出。
恐怕在不知道更多关于您正在执行的操作的情况下,很难做更详细的概述 - 但是如果(如您所说),您已经使用CUDA完成了这项任务,那么您显然已经对大部分细节有了相当好的了解。
一旦你将变换表示为矩阵-向量乘法,你所需要做的就是将源数据加载到纹理中,将你的变换指定为投影矩阵,然后将其渲染到结果中。GPU每个像素执行乘法运算。(你还可以编写更复杂的着色器等,涉及多个向量和矩阵等等,但这是基本思路。)
话虽如此,一旦您将问题表达为线性变换,您也可以通过利用例如SIMD或其中一个许多线性代数 库在CPU上使其运行得更快。除非您需要实时性能或需要处理真正巨大的数据量,否则使用CUDA/GL/shaders等可能会比它的价值更麻烦,因为在初始化库、设置渲染目标、学习图形开发的细节等方面涉及到一些笨拙的机制。
仅仅将您的内部循环从特定的数学转换为经过优化的线性代数子程序可能会给您足够的CPU性能提升,以便您可以在那里完成。
你可能会发现这个教程有用(它有点旧,但请注意,在Cg部分之后它确实包含一些OpenGL 2.x GLSL)。如果你正在寻找图像处理的捷径,我不认为GLSL有任何捷径...你需要了解很多3D光栅化方面和历史负担才能有效地使用它,尽管一旦你建立了输入和输出的框架,你就可以忘记这些并且在着色器代码中轻松地玩弄自己的算法。
作为一个做了多年这种事情的人(最初使用Direct3D着色器,但最近更多地使用CUDA),我必须说我完全同意这里推荐CUDA/OpenCL的帖子。它使生活变得简单,并且通常运行得更快。我必须非常绝望才会回到非图形算法的图形API实现。