4

我正在做一个旨在控制双板人形机器人的项目。不幸的是,我们的硬件资源非常有限(RB110 板和它的 mini PCI 显卡)。我计划将图像处理任务从 CPU 移植到可能的显卡处理器,但以前从未这样做过......我被建议使用 OpenCV,但似乎不可能,因为框架不支持我们的显卡处理器(Volari Z9s) . 然后我在 Linux Journal 上发现了一篇有趣的帖子。作者使用 OpenGL 处理从 v4l 设备检索的帧。

我对硬件 API 和 OpenGL/OpenCV 之间的关系有点困惑。为了使用 GPU,硬件是否需要图形编程框架(OpenGL/OpenCV)支持?我在哪里可以找到这样的 API?

我在 Google 上搜索了很多关于我的硬件的信息,不幸的是,供应商(XGI 技术)似乎已经灭绝了......

4

2 回答 2

5

为了使用 GPU,硬件是否需要图形编程框架(OpenGL/OpenCV)支持?我在哪里可以找到这样的 API?

OpenCL 和 OpenGL 都由 GPU 驱动程序转换为硬件指令,因此您的操作系统需要一个支持这些框架的驱动程序。大多数 GPU 驱动程序支持某些版本的 OpenGL,因此应该可以工作。

OpenGL 标准由Khronos Group维护,您可以在nehe找到一些教程。

OpenGL 的工作原理

OpenGL 接受三角形作为输入,并根据发出绘制时的状态绘制它们。大多数 OpenGL 函数都可以通过操纵此状态来更改执行的操作。图像操作可以通过将输入图像加载为纹理并在纹理处于活动状态时绘制多个顶点来完成,从而生成新图像(或更通用的新二维数据网格)。

从版本 > 2(或使用正确的 ARB 扩展)开始,可以使用称为顶点和片段着色器的 GLSL 程序控制对图像执行的操作(有更多的着色器,但这些是最旧的)。每个顶点将调用一次顶点着色器,其结果被插值并转发到片段着色器。每次将新的片段(像素)写入结果时,都会调用片段着色器。

现在这都是关于读取和写入图像的,如何将其用于对象检测?使用 Vertices 将输入纹理跨越整个视口。除了计算 rgb 颜色并将它们存储在结果中,您可以编写一个计算灰度图像/渐变图像的片段着色器,然后检查每个像素的这些纹理,如果像素位于具有特定大小的循环的中心,是线条的一部分或者与周围环境相比具有相对较高的梯度(良好的功能),或者您可以找到一个很好的并行算法。(我自己没做过)

最终结果必须读回 CPU(有时您可以在执行此操作之前使用着色器来缩小数据)。OpenCL 给它一种不太像图形的感觉,并提供了更多的自由,但支持较少。

于 2012-11-25T19:01:15.383 回答
1

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

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

于 2012-11-25T18:55:40.047 回答