访问OpenCV GpuMat频道
Get access to OpenCV GpuMat channels
我正在研究光线追踪器。我想通过使用GPU将每个像素的数据保存在OpenCV Mat
中来优化我的代码。
现在,我将像素值保存在缓冲区fb
中,缓冲区是三个值 (RGB( 的向量:
__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的每个通道中保存数据的示例。这是一种简单的方法,类似于将数据保存在 CPU 上吗?
请参阅文档。那里说
没有返回对其数据的引用的函数(因为 GPU 上的引用对 CPU 无效(
访问数据的唯一方法是通过data
功能。但是指针只能在 (cuda( 内核代码中取消引用。而且没有 据我所知,at
功能。因此,您必须计算数据的偏移量。
谢谢你的回答。他们让我思考如何以另一种方式做到这一点。我不确定这是否是处理它的最佳解决方案,但它有效,在我看来是一种在 GPU 上填充矩阵的安静简单方法。
- 在 GPU 上为矩阵保留内存
Mat output(ny, nx, CV_8UC3);
const size_t numBytes = output.step * output.rows;
unsigned char *d_output;
cudaMalloc<unsigned char>(&d_output, numBytes);
- GPU 上的填充矩阵
_global__ void render(vec3 *fb, int max_x, int max_y, Camera **cam, Triangle *data, size_t n, unsigned char* input, int step)
{
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;
int index = j * step + 3 * 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);
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());
input[index] = ib;
input[index+1] = ig;
input[index+2] = ir;
}
我将不胜感激对此代码的任何建议和评论。
相关文章:
- 如何在OpenCV 3.4.7中计算CV_32FC1 cv::GpuMat图像的(范围)直方图
- 如何有效地在OpenCV Mat和GpuMat上进行元素处理?
- 如何在OpenCV Cuda(GpuMat)中访问像素
- 如何使用opencv GpuMat在cuda上执行逐元素矩阵乘法?
- OPENCV WARPPERSPECTIVE错误:频道数量不好
- 查找 GpuMat 所在的 GPU
- 访问OpenCV GpuMat频道
- GRPC创建Google Assistant API的频道链接
- 一个人如何为gpumat编写内核
- OpenCV GpuMat dot product
- 如何访问 gpuMat 中的数据
- GPUMAT-访问自定义内核中的2个通道浮点数据
- OPENCV :: CUDA GPUMAT CV_8UC1至CV_32FC1转换黑色图像
- 客户端服务器应用程序的频道
- C++:升级到 GTX970 后,cv::gpu:GpuMat::upload 延迟较长
- 如何在 openCv 中将常数双精度值与 GpuMat 相乘
- CUDA 和 OpenCV。从 Mat 到 GpuMat 的转换不起作用
- 公开简历 |Mat to gpuMat 内存位置的异常
- alpha频道网络摄像头捕获opencv c++
- TCL C API创建并注册新频道