NPP не зависит от FreeImage и не следует каким-либо соглашениям, специфичным для библиотеки обработки изображений. Он просто следует общему соглашению, используемому в областях обработки изображений. Ожидается, что изображения будут храниться в порядке строк. Изображения обычно хранятся в виде пошаговой линейной памяти. Поэтому функции NPP принимают указатель на необработанные данные изображения, хранящиеся на устройстве, размер изображения и шаг изображения в качестве аргументов.
В примерах NPP FreeImage используется только как библиотека ввода-вывода изображений и для упрощения обработки изображений на стороне хоста.
Я разрабатываю функции обработки изображений с использованием NPP. Чтобы протестировать функции, я использую 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;
}
person
sgarizvi
schedule
11.02.2013