gpt4 book ai didi

c++ - 使用 C++/CUDA 和 CImg 将交错数据的图像数组转换为非交错数据的问题

转载 作者:行者123 更新时间:2023-11-28 04:26:59 26 4
gpt4 key购买 nike

我正在尝试使用 CUDA 将 RGBRGB 值数组转换为 RRGGBB 值数组。我现在的代码是:

__global__ void convertToo(UCHAR *imageData, UCHAR *outData, size_t dataSize)
{
size_t i = threadIdx.x + blockIdx.x * blockDim.x;
if (i >= dataSize) return;
auto index = ((i % 3) * (dataSize / 3)) + i;
if (index >= dataSize) return;
auto iVal = imageData[i];
outData[index] = iVal;
}

(索引和 Ival 用于调试目的)调用它的代码是:

auto blockSize = size / 1024;
convertToo <<<blockSize, 1024>> > (imageData, outData, size * sizeof(UCHAR));

其中 imageData 是包含 RGB 值的数组,而 outData 是新格式化数据应该去的地方。

CImg<unsigned char> image(s.c_str());
CImg<unsigned char> result(s.c_str());

size_t old_sizeX = image.width();
size_t old_sizeY = image.height();
size_t old_spectrum = image.spectrum();
size_t old_depth = image.depth();
size_t size = image.size();
image.permute_axes("cxyz");

UCHAR *imageData, *outData;
gpuErrchk(cudaMalloc(&imageData, sizeof(UCHAR) * size));
gpuErrchk(cudaMalloc(&outData, sizeof(UCHAR) * size));
gpuErrchk(cudaDeviceSynchronize());


unsigned char *data = image.data();

gpuErrchk(cudaMemcpy(imageData, data, sizeof(UCHAR) * size, cudaMemcpyHostToDevice));
gpuErrchk(cudaDeviceSynchronize());

auto blockSize = size / 1024;
convertToo <<<blockSize, 1024>> > (imageData, outData, size * sizeof(UCHAR));
gpuErrchk(cudaDeviceSynchronize());
gpuErrchk(cudaPeekAtLastError());

gpuErrchk(cudaMemcpy(result.data(), outData, size * sizeof(UCHAR), cudaMemcpyDeviceToHost));

image.permute_axes("yzcx");

CImgDisplay main_disp(image, "Original image");
CImgDisplay main_disp2(result, "Blurred image");
while (1)
{
main_disp.wait();
main_disp2.wait();
}
std::cout << "Done" << std::endl;

我遇到的问题是,当我将图像重新组合在一起时,我没有得到逻辑上应该得到的相同结果(使用 CImg)。我尝试查看每个数组并查看它们是否正确,但我似乎没有发现问题。

最佳答案

您对 index 的计算是错误的。让我们分解一下。

首先你要弄清楚你有哪个颜色分量 (i % 3),然后调整它以获得该颜色的正确“页面”(* (datasize/3)).最后,您添加像素的偏移量 (i)。

这最后一部分是错误的。由于每个像素是 3 个字节,因此您需要将 i 除以 3 以获得正确的偏移量:

auto index = ((i % 3) * (dataSize / 3)) + i / 3;

关于c++ - 使用 C++/CUDA 和 CImg 将交错数据的图像数组转换为非交错数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com