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

时间:2013-05-28 13:43:34

标签: c opencv cuda thrust

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

我的代码是这样的:

  1. 使用OpenCV IplImage指针
  2. 加载图像
  3. 将图像数据复制到thrust::device_vector
  4. 使用推力库从结构内的设备矢量中提取蓝色强度值。
  5. 现在我在从设备矢量中提取蓝色强度值时遇到问题。

    • 我在cuda中已经使用推力库对其进行了编码。
    • 我在此函数中获取蓝色强度值。
    • 我想知道如何从main函数中调用此结构FetchBlueValues

    代码:

    #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 ;
            }
        }
    
    }
    

1 个答案:

答案 0 :(得分:1)

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

示例跨步范围访问迭代器方法涵盖here