Как отобразить память OpenCL GPU в матрицу OpenCV? - PullRequest
0 голосов
/ 25 апреля 2019

Я рассчитал некоторые матрицы на GPU с OpenCL, теперь мне нужно выполнить некоторую фильтрацию на нем с помощью OpenCV. Как я могу сделать это с наименьшими накладными расходами?

cl::Buffer buffer;
cl::Kernel kernel;
kernel = cl::Kernel(program, "functionName", &err);
buffer = cl::Buffer(context, CL_MEM_READ_WRITE, size, NULL, &err);
kernel.setArg(0, buffer);
queue_IQ.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(size), cl::NullRange, NULL, NULL);

// Here, I would like to map the content of buffer to cv::Mat.

1 Ответ

1 голос
/ 25 апреля 2019

Это может быть достигнуто таким образом с очень небольшими накладными расходами:

  1. Отображение памяти графического процессора на указатель (в моем случае float *).
  2. Используйте этот указатель для создания матрицы opencv. Обратите внимание, что конструктор матрицы opencv не будет копировать или выделять новую память для указателя, вместо этого он инициализирует головку матрицы для указания на указанные данные (в данном случае на графическом процессоре).

Например, если вы работаете с поплавками:

// cl::Buffer buffer
float* dataOnGPU = static_cast<float *>(queue_IQ.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, dataSize, NULL, NULL, NULL)); // map GPU memory to float*
cv::Mat dataInMat(height, width, CV_32F, dataOnGPU); // interface float* with cv::Mat

...

// Once done, you can unmap
queue_IQ.enqueueUnmapMemObject(buffer, dataOnGPU, NULL, NULL);

Для получения дополнительной информации см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...