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