2016-06-01 4 views
1

я не знаю, как начать проект по реализации этого:OpenCL изображения вычислений, а затем экран рендеринг

  1. матрица из 16 битых целых загружаются в память GPU (Это серая шкала радиологического изображение)
  2. Вторая матрица из 16 бит целых чисел вычисляется из первого массива путем применения функции (например, алгоритм усиления контраста)
  3. Область интересов второй матрицы преобразуется в изображение RGB для отображения на экране ,

Я могу сделать шаг один и два, и я застрял на шаге 3! Я реализовал все это в CPU, так что это не вопрос обработки изображений в масштабе серого или RGB, а также создание растровых изображений для отображения. Я также реализовал первые два шага в OpenCL, а затем прочитал результирующую матрицу в памяти процессора для преобразования растрового изображения RGB, а затем отобразил ее. Но это, конечно, медленное из-за перемещения данных назад и вперед между памятью CPU и GPU (изображения действительно большие: более 100 мегапикселей).

Любая помощь приветствуется. Я программирую Delphi 10, но пример кода на C/C++ в порядке. У меня есть VC2010 и успешно перестроить образец приложения NVidia OpenCL oclNbody.

+0

Что вы пробовали уже не работали? Вы можете создавать изображения OpenCL для источника оттенков серого и результата RGB или RGBA и передавать их в ядро ​​(ы) вычисления. – Dithermaster

+0

Для шага 3 я ничего не создал, так как не знаю, как это сделать. Это то, что я прошу на самом деле. Я не знаю, как иметь изображение в OpenCL (clCreateImage), отображаемое на экране в окне, созданном Windows API CreateWindow. – fpiette

+0

Я нашел некоторый исходный код, очень близкий к тому, что мне нужно (http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf глава E.1.1 создание контекста CL из GL Context, используя Win32 API). К сожалению, вызов clGetGLContextInfoKHR вызывает нарушение доступа, которое вызвано переменной платформы, переданной аргументу функции через атрибут. Я поместил этот исходный код в Delphi, и это может быть преступником. Если бы у меня была полная программа-образец на C, я мог бы сравнить версию C с моей версией Delphi во время выполнения и понять, что не так. – fpiette

ответ

0

Решение вашей проблемы в значительной степени зависит от того, что вы хотите визуализировать. Возможно, если вы обрабатываете медицинские изображения, вам нужно отображать высококачественные изображения.

Основываясь на ваших словах, разрешение ROI намного больше, чем разрешение дисплея. Я мало знаю о качестве встроенных фильтров масштабирования изображений OpenGL, поэтому сначала я бы проверил, есть ли OpenGL вариант, прежде чем писать сложный код OpenCL - OpenGL. Во всяком случае, я бы предпочел иметь фильтр масштабирования, который я могу настроить.

Таким образом, наиболее гибким вариантом является создание 2 буферов OpenCL размера, одинакового для отображения разрешения. Затем реализуйте ядра OpenCL, которые выполняют преобразование Grayscale -> RGB & downsampling.

Псевдо-код выглядит следующим образом:

// Original grayscale image; 
cl_mem orig_image = clCreateBuffer(sizeof(uint16_t)*orig_width*orig_heigth); 

// Grayscale ROI, downscaled to dispaly resolution, still 16 bits; 
cl_mem disp_grayscale = clCreateBuffer(sizeof(uint16_t)*disp_width*disp_heigth); 

// RGB image to display; 
cl_mem disp_rgb = clCreateBuffer(sizeof(uint8_t)*3*disp_width*disp_heigth); 

clEnqueueNDRangeKernel(DownscaleFilter, orig_image, disp_grayscale); 
clEnqueueNDRangeKernel(GrayscaleToRGb, disp_grayscale, disp_rgb); 

uint8_t *pixels = clEnqueueMapBuffer(disp_rgb); 
// Deal with it as with usual image; 

clEnqueueUnmapMemoryObject(disp_rgb); 
// pixels are no longer available; 

ИМО, наиболее сложная задача состоит в разработке высококачественного строну уменьшения фильтра. Я тестировал 8-ти кратный фильтр с новым стандартом видео кодирования HEVC, это было очень хорошо.

Смежные вопросы