CUDA - 将 RGB 图像转换为灰度
CUDA - convert RGB image to Grayscale
我开始从 Udacity 视频课程(课程已有 2 年历史)学习 CUDA GPU 编程。我在 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%。剩下的一切都是白色的。
我尝试过:
三天来,我尝试了以下方法:
- 我认为问题可能是由于图像大小,因此线程数可能不是最佳的或类似的东西,因此减小了图像大小。结果还是一样。
- 我尝试了一个类似的例子,创建了一个 64x64 数组。一次取两个像素,找到它们之和的平方,它工作得很好。这是代码: https://gist.github.com/abidrahmank/7021023
- 开始在每个阶段逐个检查数据。在加载到 GPU 之前输入图像就可以了。但是当我在内核内部检查时,输入数据始终是 255。(在此处查看第 14 行)
- 最后,我使用
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 指示的参数问题外,您在线程/块设置方面也存在问题。
由于您已经将 2-D 图像视为 1-D 数组,因此这里有一个很好的示例,展示了如何为任意大小的数据设置线程/块。
https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c
- OpenCV - 如何将灰度转换为彩色(CV_8UC3)?
- C++ Gdi+将图像转换为灰度
- 将 BMP 图像转换为灰度
- 颜色到灰度转换
- 如何将图像转换为灰度 opengl c++
- 如何正确将位图转换为 OpenCV 灰度垫
- 将 YUV420p QVideoFrame 转换为灰度 OpenCV 垫
- Qmage:使用颜色表从灰度转换为RGB
- 在OpenCV中将灰度图像转换为单色
- Mat的convertTo函数在OpenCV中将灰度图像的类型转换为CV_32F时抱怨断言错误
- 使用某些系数将图像转换为灰度的最快方法
- OPENCV:从RGB转换为灰度只有蓝色
- 在C++中将彩色位图转换为灰度
- 如何将灰度/二进制垫子转换为qimage
- 使用libpng将转换设置为灰度
- 使用煤渣转换为灰度
- 将颜色图像转换为OpenCV中的灰度问题
- 在open cv中,我如何将灰度图像转换回RGB图像(颜色)
- Opencv L*a*b*到RGB的转换产生灰度输出
- 从灰度图像到QImage的快速转换