gpt4 book ai didi

c++ - 访问 OpenCV GpuMat channel

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:39 24 4
gpt4 key购买 nike

我正在研究光线追踪器。我想通过使用 GPU 将每个像素的数据保存在 OpenCV Mat 中来优化我的代码。

现在,我将像素值保存在缓冲区 fb 中,它是一个包含三个值 (RGB) 的 vector :

__global__ void render(vec3 *fb, int max_x, int max_y, Camera **cam, Triangle *data, size_t n, )
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
int j = threadIdx.y + blockIdx.y * blockDim.y;
if ((i >= max_x) || (j >= max_y)) return;
int pixel_index = j * max_x + i;
float u = float(i) / float(max_x);
float v = float(j) / float(max_y);
Ray r = (*cam)->get_ray(u,v);
fb[pixel_index] = color(r, data,n);
}

然后我将数据保存在 CPU 上的 Mat 中:

for (int j = ny - 1; j >= 0; j--) 
{
for (int i = 0; i < nx; i++)
{
size_t pixel_index = j * nx + i;
int ir = int(255.99*fb[pixel_index].r());
int ig = int(255.99*fb[pixel_index].g());
int ib = int(255.99*fb[pixel_index].b());
output.at<Vec3b>(j, i)[0] = (uchar)ib;
output.at<Vec3b>(j, i)[1] = (uchar)ig;
output.at<Vec3b>(j, i)[2] = (uchar)ir;
//std::cout << ir << " " << ig << " " << ib << "\n";
}
}

但是当我有一个大像素阵列时,这是一个非常缓慢的过程。这就是为什么我想使用 OpenCV GpuMat 并将数据直接保存在 GPU 上的原因。

问题是我真的找不到一个例子来说明如何在 GPU Mat 的每个 channel 中保存数据。这是一种简单的方法吗,类似于在 CPU 上保存数据?

最佳答案

参见 documentation .上面写着

no functions that return references to their data (because references on GPU are not valid for CPU)

访问数据的唯一方法是通过data函数。但是指针只能在 (cuda) 内核代码中取消引用。而且没有据我所知,at 功能。因此,您必须计算数据的偏移量。

关于c++ - 访问 OpenCV GpuMat channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56732885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com