NPP 既不依赖于 FreeImage,也不遵循任何图像处理库特定的约定。它只是遵循图像处理领域中使用的一般约定。它期望图像以行优先顺序存储。图像通常存储为跨步线性内存。因此,NPP 函数将指向存储在设备上的原始图像数据的指针、图像的大小和图像的步长作为参数。
在 NPP 示例中,FreeImage 仅用作图像 I/O 库,以便在主机端进行图像处理。
我利用 NPP 开发图像处理功能。为了测试这些功能,我使用 OpenCV 从磁盘读取图像,将数据复制IplImage
到原始设备指针并将指针传递给 NPP 函数。
这是一个使用 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;
}