c++ - CUDA - 将 RGB 图像转换为灰度

标签 c++ opencv image-processing cuda gpu

我开始从 Udacity 视频类(class)(类(class)已有 2 年历史)学习 CUDA GPU 编程。我在 Nvidia GeForce GT 630M GPU 上使用 CUDA 5.5 和 Visual Studio Express 2012(学生版,因此并非所有 CUDA 调试功能都不可用)。

只是实现了一些 vector 加法和其他简单的操作。

现在我正在尝试将 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。(检查 line 14 here)
  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 也很难被原始内核打败。

关于c++ - CUDA - 将 RGB 图像转换为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19421529/

相关文章:

c++ - 如何使用 printf 打印空白字符?

java - 如何获取 Mat 图像的像素区域

c++ - 自动矢量化 : Convincing the compiler that alias check is not necessary

c# - 将EMGUCV VectorOfKeyPoint保存到XML并再次加载

c++ - 用于 GLSL 图像处理的小型 C/C++ 库?

html - 将相机中的图像捕获到表单或 html5 Canvas 中

c++ - 嵌套模板类型的c++类成员变量

c++ - 从 std::multimap 删除元素时的特殊行为

c++ - 当方程式返回 nan 作为答案时该怎么办?

java - 如何判断 Android 应用程序还剩多少内存可供使用?