4

freeImageのみを使用するCUDAビルド用のNPPライブラリですか、それともNPP関数の入力として他の構造体または単にunsigned char *imageを使用できますか。

私がこの質問をする理由は、NPP のすべてのサンプルに freeImage の大きなラッパーがあるためです。

私は NVIDIA Performance Primitives ( NPP ) を徹底的に調べましたが、そこには画像が言及されているだけで、使用されている画像形式は特にありません。

freeImage を使用せずに、またはディスクからイメージをロードせずに NPP を使用する方法の例があれば、私は用心深く幸せになります。

4

1 に答える 1

7

NPP は FreeImage に依存しておらず、画像処理ライブラリ固有の規則にも従っていません。画像処理ドメインで使用される一般的な規則に従っているだけです。画像が行優先順に格納されることを想定しています。画像は通常、ストライド リニア メモリとして保存されます。したがって、NPP 関数は、デバイスに保存されている生の画像データへのポインター、画像のサイズ、および画像のステップを引数として受け取ります。

NPP サンプルでは、​​FreeImage は画像 I/O ライブラリとして、またホスト側での画像処理を容易にするために使用されています。

NPPを活用した画像処理機能の開発を行っています。関数をテストするには、OpenCV を使用してディスクからイメージを読み取り、データをIplImageraw デバイス ポインターにコピーして、ポインターを 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;
}
于 2013-02-11T16:09:22.510 に答える