NPP は FreeImage に依存しておらず、画像処理ライブラリ固有の規則にも従っていません。画像処理ドメインで使用される一般的な規則に従っているだけです。画像が行優先順に格納されることを想定しています。画像は通常、ストライド リニア メモリとして保存されます。したがって、NPP 関数は、デバイスに保存されている生の画像データへのポインター、画像のサイズ、および画像のステップを引数として受け取ります。
NPP サンプルでは、FreeImage は画像 I/O ライブラリとして、またホスト側での画像処理を容易にするために使用されています。
NPPを活用した画像処理機能の開発を行っています。関数をテストするには、OpenCV を使用してディスクからイメージを読み取り、データをIplImage
raw デバイス ポインターにコピーして、ポインターを NPP 関数に渡します。
OpenCV をホストとして NPP を使用する例を次に示します。
#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;
}