为什么在我的常规图像乘法和cuda图像乘法之间只有很小但可以识别的差异?

为什么在我的常规图像乘法和cuda图像乘法之间只有很小但可以识别的差异?,cuda,nvidia,Cuda,Nvidia,在我的常规图像乘法和cuda图像乘法之间几乎没有什么区别,但可以识别。常规图像稍轻一些 主要功能部分: Mat im1 = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE); int size = im1.rows * im1.cols; int i = 0; uint8_t * d_a; im1 = im1 * 3; //this made image a little lighter comparatively. imshow("Original", im1)

在我的常规图像乘法和cuda图像乘法之间几乎没有什么区别,但可以识别。常规图像稍轻一些

主要功能部分:

Mat im1 = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
int size = im1.rows * im1.cols;
int i = 0;
uint8_t * d_a;
im1 = im1 * 3; //this made image a little lighter comparatively.
imshow("Original", im1);

cudaMalloc(&d_a, sizeof(uint8_t)*size);
cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice);

dim3 threadsPerBlock(im1.cols);
dim3 numBlocks(im1.rows);


colonal << <numBlocks, threadsPerBlock >> >(d_a);
cudaMemcpy(&im1.data[0], d_a, sizeof(uint8_t)*size, cudaMemcpyDeviceToHost);

cudaFree(d_a);

imshow("new", im1);
waitKey();

我不希望您显示的两个图像是相同的。这行代码:

im1 = im1 * 3; 
实际修改
im1
数据。每个
im1
像素现在都大了3倍

然后将修改后的数据复制到设备:

cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice);
再把它乘以3

如果希望两个图像看起来相同,请执行以下操作:

im1 = im1 * 3; //this made image a little lighter comparatively.
imshow("Original", im1);
我建议这样做:

Mat im2 = im1 * 3; 
imshow("Original", im2);

如果在每种情况下只打印出几个像素的数值,问题也应该非常明显。在您的原始代码中,您应该看到像素增加了3倍。

当您请求调试帮助时,您应该提供一个答案,您提供的不是。当问题基本上是“从这个不完整的示例中找出我的小错误”时您没有提供任何有助于他人的信息,也没有向现有的CUDA有用信息中添加任何内容。这就是这个问题被否决的原因。
Mat im2 = im1 * 3; 
imshow("Original", im2);