我的常规和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();
这是内核:
__global__
void colonal(uint8_t * a)
{
int x = blockIdx.x;
int y = threadIdx.x;
int width = blockDim.x;
int index = (x * width)+y;
a[index] = a[index] * 3;
}
答案 0 :(得分:3)
我不希望你正在显示的两个图像都是一样的。这行代码:
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倍两次。