GPU编程在图像处理中的应用

4
我正在开展一个控制双足机器人的项目。不幸的是,我们只有极其有限的硬件资源(RB110板和其迷你PCI图形卡)。如果可能的话,我计划将图像处理任务从CPU移植到图形卡处理器,但之前从未尝试过... 我被建议使用OpenCV,但似乎不可能,因为我们的图形卡处理器(Volari Z9s)不受该框架支持。然后我在Linux期刊上找到了一篇有趣的文章。作者使用OpenGL处理从v4l设备检索到的帧。
我对硬件API和OpenGL / OpenCV之间的关系有点困惑。为了利用GPU,硬件需要得到图形编程框架(OpenGL / OpenCV)的支持吗?在哪里可以找到这样的API?
我对自己的硬件进行了很多谷歌搜索,不幸的是,供应商(XGI Technology)似乎已经消失了...
2个回答

5
为了利用GPU,硬件需要被图形编程框架(OpenGL/OpenCV)支持吗?我在哪里可以找到这样的API?
OpenCL和OpenGL都由GPU驱动程序转换为硬件指令,因此您需要一个支持这些框架的操作系统驱动程序。大多数GPU驱动程序支持某个版本的OpenGL,所以应该可以使用。
OpenGL标准由Khronos Group维护,您可以在nehe找到一些教程。
OpenGL如何工作
OpenGL接受三角形作为输入,并根据发出绘制时的状态进行绘制。大多数OpenGL函数是通过操作此状态来更改执行的操作。可以通过将输入图像作为纹理加载并绘制具有活动纹理的多个顶点来进行图像操作,从而生成新图像(或更通用的新2D数据网格)。
从版本>2(或使用正确的ARB扩展)开始,对图像执行的操作可以通过称为顶点和片段着色器的GLSL程序进行控制(还有更多的着色器,但这些是最古老的)。每个顶点将调用一次顶点着色器,其结果会被插值并转发到片段着色器。每次写入新的片段(像素)时都会调用片段着色器。

现在这一切都与读写图像有关,如何将其用于对象检测? 使用顶点将输入纹理跨越整个视口。不要计算rgb颜色并将其存储在结果中,而是编写一个片段着色器来计算灰度图像/梯度图像,然后检查每个像素的这些纹理,以确定像素是否位于具有特定大小的循环的中心,是否是线条的一部分,或者仅具有与其周围相比相对较高的梯度(良好的特征),或者您可以找到良好的并行算法的任何其他内容。(我自己没有做过这个)

最终结果必须读回到CPU(有时您可以使用着色器在执行此操作之前缩小数据)。OpenCL使其感觉不那么像图形,并且给予了更多自由,但受支持程度较低。


感谢您的回答。我认为图形卡已经安装了通用驱动程序,由主线内核提供支持(因为操作系统可以使用它!)。它支持VGA和SVGA模式。今天我写了我的第一个OpenGL程序(茶壶查看器)。但是我不明白它在底层是如何工作的。我该如何在OpenGL中编写我的对象检测算法?对我来说,它看起来像一组巨大的函数... - sorush-r
@sorush-r 扩展了我的答案,你真的应该检查一下你的驱动程序是否支持OpenGL,或者是否可以找到一个支持它的驱动程序。如果没有驱动程序/硬件支持,你将无法获得任何性能提升。 - josefx

1

首先,您需要着色器支持(GLSLasm)。

通常的方法是使用您的图像(纹理)渲染全屏四边形,并应用片段着色器。这被称为后期处理,并受到指令集和硬件限制的限制。在基本级别上,它允许您以并行方式在大数据集上应用简单的(单个函数),从而产生另一个数据集。但分支(如果支持)是第一性能敌人,因为GPU由几个SIMD块组成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接