Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+将交织数据的图像数组转换为非交织数据时出现问题+/CUDA与CImg_C++_Image_Cuda_Cimg - Fatal编程技术网

C++ 使用C+将交织数据的图像数组转换为非交织数据时出现问题+/CUDA与CImg

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 /

我正在尝试使用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));
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;

非常感谢你,我应该意识到这一点;我一直盯着自己看。非常感谢。非常感谢,我应该意识到这一点;我一直盯着自己看。非常感谢。