АЭС CUDA без freeImage

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

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

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

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


person Steenstrup    schedule 11.02.2013    source источник


Ответы (1)


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