簡體   English   中英

CUDA - 將RGB圖像轉換為灰度

[英]CUDA - convert RGB image to Grayscale

我開始從Udacity視頻課程學習CUDA GPU編程(課程是2歲)。 我在Nvidia GeForce GT 630M GPU上使用CUDA 5.5和Visual Studio Express 2012 (學生版,因此並非所有CUDA調試功能都不可用)。

剛剛實現了一些向量加法和其他簡單的操作。

現在我正在嘗試將RGB圖像轉換為灰度圖像 我在OpenCV的幫助下閱讀圖像。 (無論如何,我失敗了我嘗試的任何方法。這就是我在這里的原因)

下面是我的.cpp文件: https//gist.github.com/abidrahmank/7020863

以下是我的.cu文件: https ://gist.github.com/abidrahmank/7020910

我的輸入圖像是一個簡單的64x64彩色圖像(實際上我首先使用了512x512圖像,沒有工作,所以降到64x64以檢查是否是問題。它似乎不是這樣)

問題

我的CUDA實現的輸出圖像是白色圖像 所有值都是255.在這里和那里的某處,有一些灰色像素,可能小於1%。 剩下的一切都是白色的。

我嘗試了什么:

三天,我嘗試了以下事情:

  1. 我認為問題可能是由於圖像大小,因此線程數可能不是最佳或類似的東西,因此縮小圖像大小。 還是一樣的結果。
  2. 我嘗試了一個類似的例子,創建了一個64x64陣列。 一次取兩個像素,找到它們的總和的平方,它工作正常。 這是代碼: https//gist.github.com/abidrahmank/7021023
  3. 開始在每個階段逐個檢查數據。 在加載到GPU之前輸入圖像很好。 但是當我在內核中檢查時,輸入數據總是255.在這里檢查第14行
  4. 最后,我使用CudaMemset將所有GPU數據設置為零並檢查內核中的輸入數據,它仍然是255。

所以我沒有任何其他選擇在StackOverflow上做其他的詢問。

誰能告訴我我犯的錯誤是什么?

你的內核簽名說:

__global__ void kernel(unsigned char* d_in, unsigned char* d_out)

但你稱之為:

kernel<<<rows,cols>>>(d_out, d_in);

哪一個 ,哪一個是

在過去完成了相當多的CUDA編程之后,我強烈建議您使用Thrust而不是手工制作內核。 即使thrust::for_each也很難被原始內核擊敗。

除了DanielKO指出的參數問題,你還有線程/塊設置問題。

由於您已經將二維圖像視為一維數組,因此這里有一個很好的示例,說明如何為任意大小的數據設置線程/塊。

https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM