C 在推力中调用用户定义函数

C 在推力中调用用户定义函数,c,opencv,cuda,thrust,C,Opencv,Cuda,Thrust,我正在使用OpenCV加载一个.png文件,我想使用推力库提取它的蓝色强度值 我的代码是这样的: 使用OpenCVIplImage指针加载图像 将图像数据复制到推力::设备\u向量中 使用推力库从结构内部的设备向量中提取蓝色强度值 现在我在从设备向量中提取蓝色强度值时遇到了一个问题 我在cuda中编写了这段代码,现在已经使用推力库对其进行了转换 我在这个函数中获取蓝色强度值 我想知道如何从主函数调用这个结构FetchBlueValues 代码: #定义图像宽度14 #定义图像高度10 推力:

我正在使用OpenCV加载一个
.png
文件,我想使用推力库提取它的蓝色强度值

我的代码是这样的:

  • 使用OpenCV
    IplImage
    指针加载图像
  • 将图像数据复制到
    推力::设备\u向量中
  • 使用推力库从结构内部的设备向量中提取蓝色强度值 现在我在从设备向量中提取蓝色强度值时遇到了一个问题

    • 我在cuda中编写了这段代码,现在已经使用推力库对其进行了转换
    • 我在这个函数中获取蓝色强度值
    • 我想知道如何从主函数调用这个结构
      FetchBlueValues
    代码:

    #定义图像宽度14
    #定义图像高度10
    推力:设备向量二进制图像(图像宽度*图像高度);
    推力:设备_向量ImageVector(ImageWidth*ImageHeight*3);
    结构值
    {
    __主机设备无效运算符()
    {
    int指数=0;
    对于(inti=0;iimageData;
    推力::设备_ptrdev _ptr=推力::设备_malloc(图像高度*src->宽度步长);
    推力:复制(原始ptr,原始ptr+(src->widthStep*ImageHeight),开发ptr);
    int指数=0;
    对于(int j=0;jn通道)+0];
    ImageVector[index+1]=(int)dev_ptr[(j*src->widthStep)+(i*src->nChannels)+1];
    ImageVector[index+2]=(int)dev_ptr[(j*src->widthStep)+(i*src->nChannels)+2];
    指数+=3;
    }
    }
    }
    
    由于图像以像素格式存储,并且每个像素都包含不同的颜色,因此有一个自然的“步幅”在访问每个像素的单个颜色分量时。在这种情况下,一个像素的颜色分量似乎以每像素三个连续的
    int
    数量存储,因此给定颜色分量的访问步长为三


    本文介绍了一种跨步范围访问迭代器方法示例。

    由于图像以像素格式存储,并且每个像素都包含不同的颜色,因此存在一种自然的“跨步”在访问每个像素的单个颜色分量时。在这种情况下,一个像素的颜色分量似乎以每像素三个连续的
    int
    数量存储,因此给定颜色分量的访问步长为三


    本文介绍了一个跨范围访问迭代器方法的示例。

    您的代码存在许多问题。您是否阅读了(正如我之前向您建议的那样?)其中给出了一些示例(如saxpy函子)(以及许多其他地方)但是,你的函数可能不需要一个循环,也可以考虑避免一个函子和数据的提取,而只是用一个代替。YA谢谢。我在代码中尝试过范围访问机制,它工作了…但是它在设备内部运行?是的,如果您在
    设备\u向量上运行,那么它在设备内部运行。例如,在我链接的示例代码中,
    推力::填充操作在设备上运行(使用
    跨步范围
    迭代器访问特定元素).Ya好的,谢谢…我的代码运行良好。您的代码存在许多问题。您是否阅读了(正如我之前向您建议的那样?)其中给出了一些示例(例如saxpy函子)以及其他许多地方但是,你的函数可能不需要一个循环,也可以考虑避免一个函子和数据的提取,而只是用一个代替。YA谢谢。我在代码中尝试过范围访问机制,它工作了…但是它在设备内部运行?是的,如果您在
    设备\向量
    上运行,那么它在设备内部运行。例如,在我链接的示例代码中,
    推力::填充
    操作在设备上运行(使用
    跨步\范围
    迭代器访问特定元素)。好的,谢谢…我的代码工作正常。
    #define ImageWidth 14
    #define ImageHeight 10
    
    thrust::device_vector<int> BinaryImage(ImageWidth*ImageHeight);
    thrust::device_vector<int> ImageVector(ImageWidth*ImageHeight*3);
    
    struct FetchBlueValues
    {
        __host__ __device__ void operator() ()
        {
            int index = 0 ;
            for(int i=0; i<= ImageHeight*ImageWidth*3 ; i = i+3)
            {
                BinaryImage[index]= ImageVector[i];
                index++;
            }
        }
    };
    
    void main()
    {
        src = cvLoadImage("../Input/test.png", CV_LOAD_IMAGE_COLOR);
    
        unsigned char *raw_ptr,*out_ptr;
        raw_ptr = (unsigned char*) src->imageData;
    
        thrust::device_ptr<unsigned char> dev_ptr = thrust::device_malloc<unsigned char>(ImageHeight*src->widthStep);
    
        thrust::copy(raw_ptr,raw_ptr+(src->widthStep*ImageHeight),dev_ptr);
        int index=0;
        for(int j=0;j<ImageHeight;j++)
        {
            for(int i=0;i<ImageWidth;i++)
            {
                ImageVector[index] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 0 ];
                ImageVector[index+1] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 1 ];
                ImageVector[index+2] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 2 ];
    
                index +=3 ;
            }
        }
    
    }