АЭС НКТ без freeImage

100
8

Является ли библиотека NPP для сборки CUDA использовать freeImage или я могу использовать другое изображение структуры или просто без знака char * в качестве входных данных в функции АЭС.


Причина, по которой я делаю этот вопрос, состоит в том, что все образцы для АЭС имеют большие обертки для freeImage.


Я подробно рассмотрел NVIDIA Performance Primitives (NPP), но там упоминается только изображение, а не конкретный формат изображения.


Если у вас есть пример того, как использовать АЭС без freeImage или просто без загрузки изображения с диска, я бы с радостью подумал.

спросил(а) 2021-01-19T14:49:19+03:00 6 месяцев, 2 недели назад
1
Решение
110

АЭС не зависит ни от FreeImage, ни от каких-либо конкретных правил библиотеки обработки изображений. Он просто следует общему соглашению, используемому в доменах обработки изображений. Он ожидает, что изображения будут храниться в строчном порядке. Изображения обычно хранятся в виде линейной линейной памяти. Поэтому функции АЭС принимают указатель на данные необработанного изображения, хранящиеся на устройстве, размер изображения и шаг изображения в качестве аргументов.


В образцах NPP FreeImage используется как библиотека ввода-вывода изображений и упрощает обработку изображений на стороне хоста.


Я разрабатываю функции обработки изображений с использованием АЭС. Чтобы проверить функции, я использую OpenCV для чтения изображения с диска, скопируйте данные из IplImage в указатель необработанного устройства и передайте указатель на функцию АЭС.

Вот пример использования NPP с OpenCV в качестве хоста.


#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
const int width = 640, height = 480;

//Create an 8 bit single channel image
IplImage* img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
//Set All Image Pixels To 0
cvZero(img);

cvShowImage("Input",img);
cvWaitKey();

const int step = img->widthStep;
const int bytes = img->widthStep * img->height;

unsigned char *dSrc, *dDst;
cudaMalloc<unsigned char>(&dSrc,bytes);
cudaMalloc<unsigned char>(&dDst,bytes);

//Copy Data From IplImage to Device Pointer
cudaMemcpy(dSrc,img->imageData,bytes,cudaMemcpyHostToDevice);

NppiSize size;
size.width = width;
size.height = height;

const Npp8u value = 150;

//Call NPP function to add a constant value to each pixel of the image
nppiAddC_8u_C1RSfs(dSrc,step,value,dDst,step,size,1);

//Copy back the result from device to IplImage
cudaMemcpy(img->imageData,dDst,bytes,cudaMemcpyDeviceToHost);

cudaFree(dSrc);
cudaFree(dDst);

cvShowImage("Output",img);
cvWaitKey();

cvReleaseImage(&img);

return 0;
}

ответил(а) 2021-01-19T14:49:19+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема