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