2012-04-25 122 views
1

我想實現一個系統的算法,相機得到1000fps,我需要得到所有圖像中的每個像素的值,並對像素的演變進行不同的計算[i ] [j]在N個圖像中,對於圖像中的所有像素。我有(unsigned char * ptr)我想將它們傳輸到GPU並開始實現算法。但我不確定什麼是實時處理的最佳選擇。 我的系統: CPU英特爾至強x5660 2.8GHz的(2個處理器) GPU的NVIDIA Quadro 5000實時Cuda圖像處理建議

我有以下問題:

  1. 我做我需要添加任何圖像處理庫除了CUDA ?如果是的話,你有什麼建議?

  2. 我可以爲圖像大小中的每個像素創建一個包含圖像[1:n]值的像素[i,j]矩陣嗎?例如對於200x200尺寸的1000張圖像,我將最終得到40000個矩陣,每個 包含1000個像素值? CUDA是否爲OpenCV提供了一些選項來創建矩陣?或矢量?

+0

將是 「流導向」 在那裏你會不斷地清除最久的1000幀,並添加操作最新?或者,它更像是一個批處理操作,您可以處理1000個幀,然後將其拋出並執行1000個新幀? – 2012-04-25 13:30:02

+0

我認爲它應該是「流媒體導向」。 – user261002 2012-04-25 13:50:41

+1

既然你提到了OpenCV,你可能想把它作爲標籤添加到你的問題中。 – karlphillip 2012-04-25 17:03:17

回答

2

聽起來你會有40000個獨立的計算,其中每個計算只能在一個(時間)像素內工作。如果是這樣,這對GPU應該是一個很好的任務。您的352核心Fermi GPU應該能夠擊敗您的12個超線程至強核心。

您計劃運行通用操作的算法是什麼?這聽起來可能不是,在這種情況下,你可能不得不編寫自己的內核。

是的,您可以在CUDA中擁有任何類型的元素數組。

這是一種「面向流」的方法,對於GPU實現非常有用,因爲與通過PCIe總線傳輸相比,它最大限度地提高了計算次數。它可能也會帶來一些困難,如果你想按特定的順序處理給定像素的1000個值(例如,從最舊到最新),你可能會希望避免不斷移動內存中的所有幀(使空間爲最新的框架)。它會稍微複雜化你的像素值的尋址,但是避免移動幀的最佳方法可能是每次添加新幀時用最新的幀覆蓋最早的幀。這樣,你最終會得到一個「堆棧幀」,它的排列順序相當有序,但在其中的某處存在舊幀和新幀之間的不連續性。

4

1 - 我需要添加除CUDA以外的任何圖像處理庫嗎?

蘋果和橘子。每個人都有不同的目的。像OpenCV這樣的圖像處理庫提供的不僅僅是簡單的加速矩陣計算。也許你不需要OpenCV來完成這個項目中的處理,因爲你似乎寧願直接使用CUDA。但是你仍然可以使用OpenCV來更容易地從磁盤加載和寫入不同的圖像格式。

2 - CUDA是否爲OpenCV提供了一些選項來創建矩陣?

絕對。前段時間,我編寫了一個簡單的(教育)應用程序,使用OpenCV從磁盤加載圖像並使用CUDA將其轉換爲灰度版本。該項目名爲cuda-grayscale。我沒有用CUDA 4測試過它。x,但代碼展示瞭如何在組合OpenCV和CUDA時完成基本操作。

+2

此外,openCV使加載/保存/查看圖像變得非常容易 - 對測試有幫助! – 2012-04-25 18:48:50

1

我需要添加任何圖像處理庫除了CUDA? 如果是,你有什麼建議?

披露:我公司開發&市場CUVILib

有極少數的選擇,當涉及到GPU加速成像庫也提供了通用的功能。 CUVILib是它具有以下,非常適合您的特定需求其中一個選項:保持你的圖像數據和圖像的二維矩陣

  1. CuviImage對象
  2. 您可以編寫自己的GPU功能和使用CuviImage作爲2D GPU矩陣。
  3. CUVILib已經提供了豐富的圖像功能,如顏色操作,圖像統計,特徵檢測,運動估計,FFT,圖像轉換等,因此您可以找到所需的功能。

至於GPU是否適合您的應用的問題:是的!成像是並行計算理想的領域之一。

鏈接: