C++ 使用C+将交织数据的图像数组转换为非交织数据时出现问题+/CUDA与CImg
我正在尝试使用CUDA将RGBRGB值数组转换为RRGGBB值数组。我现在的代码是:C++ 使用C+将交织数据的图像数组转换为非交织数据时出现问题+/CUDA与CImg,c++,image,cuda,cimg,C++,Image,Cuda,Cimg,我正在尝试使用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 /
__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));
auto blockSize=size/1024;
ConvertTo(图像数据、输出数据、大小*大小(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;
cimgimage(s.c_str());
CImg结果(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();
图像。排列轴(“cxyz”);
UCHAR*图像数据,*输出数据;
gpuerchk(cudaMalloc(&imageData,sizeof(UCHAR)*size));
gpuerchk(cudaMalloc(&outData,sizeof(UCHAR)*size));
gpuErrchk(cudaDeviceSynchronize());
无符号字符*数据=image.data();
gpuErrchk(cudaMemcpy(图像数据,数据,大小(UCHAR)*大小,cudaMemcpyHostToDevice));
gpuErrchk(cudaDeviceSynchronize());
自动块大小=大小/1024;
ConvertTo(图像数据、输出数据、大小*大小(UCHAR));
gpuErrchk(cudaDeviceSynchronize());
gpuerchk(cudaPeekAtLastError());
gpuerchk(cudaMemcpy(result.data(),outData,size*sizeof(UCHAR),cudaMemcpyDeviceToHost));
图像排列轴(“yzcx”);
CImgDisplay main_disp(图像,“原始图像”);
CImgDisplay main_disp2(结果,“模糊图像”);
而(1)
{
main_disp.wait();
main_disp2.wait();
}
std::cout您对索引的计算是错误的。让我们把它分解一下
首先,您要找出您拥有的颜色组件(i%3
),然后将其调整为该颜色的正确“页面”(*(datasize/3)
)。最后,添加像素的偏移量(i
)
最后一部分是错误的。由于每个像素为3字节,因此需要将i
除以3以获得正确的偏移量:
auto index = ((i % 3) * (dataSize / 3)) + i / 3;
您对索引的计算是错误的。让我们把它分解一下
首先,您要找出您拥有的颜色组件(i%3
),然后将其调整为该颜色的正确“页面”(*(datasize/3)
)。最后,添加像素的偏移量(i
)
最后一部分是错误的。由于每个像素为3字节,因此需要将i
除以3以获得正确的偏移量:
auto index = ((i % 3) * (dataSize / 3)) + i / 3;
非常感谢你,我应该意识到这一点;我一直盯着自己看。非常感谢。非常感谢,我应该意识到这一点;我一直盯着自己看。非常感谢。