在 thrust 中调用用户定义的函数

标签 c opencv cuda thrust

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

我的代码是这样的:

  1. 使用 OpenCV IplImage 指针加载图像
  2. 将图像数据复制到thrust::device_vector
  3. 使用推力库从结构内的设备 vector 中提取蓝色强度值。

现在我在从设备 vector 中提取蓝色强度值时遇到了问题。

  • 我在 cuda 中编写了这段代码,现在已经使用推力库对其进行了转换。
  • 我在此函数中获取蓝色强度值。
  • 我想知道如何从主函数调用此结构 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 ;
        }
    }

}

最佳答案

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

涵盖了跨范围访问迭代器方法的示例 here .

关于在 thrust 中调用用户定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16793659/

相关文章:

c - MPQueue - 它是什么以及如何使用它?

opencv - 如何从 GPU 设备获取 YUV 组件?

python - OpenCV(4.2.0) (-206 :Bad flag (parameter or structure field)) Unrecognized or unsupported array type in function 'cvGetMat'

cuda - 在两个 GPU 上运行的代码无法达到并发执行并且加速效果无关

r - R 中的矩阵运算 : parallelization, 稀疏运算,GPU 计算

c - 分区代码错误是什么?

c - 如何在 GCC 中指定枚举大小?

opencv - 如何修复图像捕获中的 Julia OpenCV Cxx 内存泄漏?

c++ - 为 Thrust 重载 "+"运算符,有什么想法吗?

c - 仅使用两个不起作用的变量进行交换