2012-11-25 63 views
4

我正在開發一個旨在控制一個二聯類人機器人的項目。不幸的是,我們有一套非常有限的硬件資源(一個RB110 board and its mini PCI graphic card)。我正計劃將圖像處理任務從CPU移植到可能的圖形卡處理器,但之前從未完成...建議使用OpenCV,但似乎不可行,因爲我們的圖形卡處理器(Volari Z9s)不受框架支持。然後我在Linux Journal上找到了an interesting post。作者已經使用OpenGL來處理從v4l設備檢索到的幀。用於圖像處理的GPU編程

我對硬件API和OpenGL/OpenCV之間的關係有點困惑。爲了利用GPU,硬件需要由圖形編程框架(OpenGL/OpenCV)提供嗎?我在哪裏可以找到這樣的API?

我用Google搜索了很多關於我的硬件,不幸的是,供應商(XGI Technology)似乎是莫名其妙地消失......

回答

5

包括爲了利用GPU,做硬件需要通過圖形編程框架(的OpenGL/OpenCV的)被sopported?我在哪裏可以找到這樣的API?

OpenCL和OpenGL都被GPU驅動程序轉換爲硬件指令,因此您需要支持這些框架的操作系統驅動程序。大多數GPU驅動程序都支持某些版本的OpenGL,因此應該可以工作。

OpenGL標準由Khronos Group維護,您可以在nehe找到一些教程。

OpenGL的工作原理

的OpenGL接受三角形作爲輸入,並根據發放抽籤時,它的狀態爲吸引過來。大多數OpenGL函數都可以改變操作這個狀態所執行的操作。圖像處理可以通過將輸入圖像加載爲紋理並繪製紋理活動的幾個頂點來完成,從而生成新的圖像(或更通用的新的2D數據網格)。

從版本> 2(或使用正確的ARB擴展名),可以使用稱爲頂點和片段着色器的GLSL程序(有更多着色器,但這些是最早的)來控制對圖像執行的操作。頂點着色器將在每個頂點被調用一次,其結果被插值並轉發給片段着色器。每次將新片段(像素)寫入結果時,都會調用片段着色器。

現在,這是關於閱讀和寫作圖像,如何將其用於物體檢測? 使用頂點跨越整個視口上的輸入紋理。除了計算RGB顏色並將它們存儲在結果中,您可以編寫一個碎片着色器來計算灰度圖像/漸變圖像,然後檢查每個像素的這些紋理,如果該像素位於具有特定大小,行的一部分的循環的中心或者與其周圍(好的特徵)相比具有相對較高的梯度,或者真的在說話,否則你可以找到一個好的並行算法。 (自己沒有這樣做)

最終的結果必須讀回到CPU(有時你可以使用着色器在執行此操作之前縮放數據)。 OpenCL使它具有更少的圖形感,並且提供了更多的自由度,但不太受支持。

+0

感謝您的回答。我認爲顯卡有一個由mainline內核安裝的通用驅動程序(因爲操作系統可以使用它!)它支持VGA和SVGA模式。我今天編寫了我的第一個OpenGL程序(茶壺查看器)。但無法理解它如何在引擎蓋下工作。我如何在OpenGL中編寫我的對象檢測算法?它看起來像一個巨大的功能集... –

+0

@ sorush-r擴展了我的答案,你真的應該檢查你的驅動程序是否支持OpenGL,或者如果你能找到支持OpenGL的驅動程序。沒有驅動程序/硬件支持,您無法獲得任何性能。 – josefx

1

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

通常的方式將使用圖像(紋理)渲染全屏四邊形並應用片段着色器。它被稱爲Post-Processing並受限於指令集和硬件的其他限制。在基本的lvl上,它允許您以並行的方式在大數據集上應用簡單的(單一函數),這會產生另一個數據集。但是分支(如果支持的話)是第一次演出的敵人,因爲GPU從幾個SIMD blocks