АЭС CUDA без freeImage

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

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

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

Если у вас есть пример того, как использовать NPP без freeImage или просто без загрузки образа с диска, то я был бы очень рад.

1 ответ

Решение

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

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

Я разрабатываю функции обработки изображений с использованием АЭС. Чтобы проверить функции, я использую 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;
}
Другие вопросы по тегам