Проблема преобразования массива изображений с чередующимися данными в не чередующиеся данные с использованием C ++ / CUDA и CImg - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь преобразовать массив значений RGBRGB в массив значений RRGGBB, используя CUDA. Код, который у меня есть сейчас:

__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), который я должен логически получить. Я попытался просмотреть каждый массив и посмотреть, верны ли они, но, похоже, проблема не обнаружена.

1 Ответ

0 голосов
/ 05 января 2019

Ваш расчет для index неверен. Давайте разберемся с этим.

Сначала вы выясните, какой цветовой компонент у вас есть (i % 3), затем отрегулируйте его для правильной "страницы" для этого цвета (* (datasize / 3)). Наконец, вы добавляете смещение для пикселя (i).

Эта последняя часть неверна. Поскольку каждый пиксель составляет 3 байта, вам нужно разделить i на 3, чтобы получить правильное смещение:

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