Image processing 无freeImage的核电站CUDA

Image processing 无freeImage的核电站CUDA,image-processing,cuda,npp,Image Processing,Cuda,Npp,CUDA build的NPP库是否仅使用freeImage,或者我是否可以使用其他结构或仅使用无符号字符*图像作为NPPs函数的输入 我提出这个问题的原因是NPP的所有样品都有freeImage的大包装 我已经仔细看过英伟达的表现原语(NPP)了,但是这里只提到了一个图像,而不是使用哪种图像格式。 如果您有一个示例,说明如何在不使用freeImage或不从磁盘加载映像的情况下使用NPP,那么我会非常小心。NPP既不依赖freeImage,也不遵循任何特定于图像处理库的约定。它只是遵循图像处理领域

CUDA build的NPP库是否仅使用freeImage,或者我是否可以使用其他结构或仅使用无符号字符*图像作为NPPs函数的输入

我提出这个问题的原因是NPP的所有样品都有freeImage的大包装

<>我已经仔细看过英伟达的表现原语(NPP)了,但是这里只提到了一个图像,而不是使用哪种图像格式。
如果您有一个示例,说明如何在不使用freeImage或不从磁盘加载映像的情况下使用NPP,那么我会非常小心。NPP既不依赖freeImage,也不遵循任何特定于图像处理库的约定。它只是遵循图像处理领域中使用的一般约定。它希望图像按行主顺序存储。图像通常存储为跨步线性存储器。因此,NPP函数将指向存储在设备上的原始图像数据的指针、图像的大小和图像的大小作为参数

在NPP示例中,FreeImage仅用作映像I/O库,便于主机端的映像处理

我利用NPP开发图像处理功能。为了测试函数,我使用OpenCV从磁盘读取图像,将数据从
IplImage
复制到原始设备指针,并将指针传递给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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{    
常数int宽度=640,高度=480;
//创建8位单通道映像
IplImage*img=cvCreateImage(cvSize(宽度、高度)、IPL_深度_8U,1);
//将所有图像像素设置为0
cvZero(img);
cvShowImage(“输入”,img);
cvWaitKey();
const int step=img->widthStep;
const int bytes=img->widthStep*img->height;
无符号字符*dSrc,*dDst;
cudamaloc(&dSrc,字节);
cudamaloc(&dDst,字节);
//将数据从IplImage复制到设备指针
cudaMemcpy(dSrc,img->imageData,bytes,cudaMemcpyHostToDevice);
扩大规模;
size.width=宽度;
尺寸.高度=高度;
常数Npp8u值=150;
//调用NPP函数为图像的每个像素添加一个常量值
nppiAddC_8u_C1RSfs(dSrc,步长,值,dDst,步长,大小,1);
//将结果从设备复制回IplImage
cudaMemcpy(img->imageData,dDst,bytes,cudaMemcpyDeviceToHost);
cudaFree(dSrc);
cudaFree(dDst);
cvShowImage(“输出”,img);
cvWaitKey();
cvReleaseImage(&img);
返回0;
}