【问题标题】:Access pixels in gpu::mat访问 gpu::mat 中的像素
【发布时间】:2014-06-15 20:09:04
【问题描述】:

我想知道在使用 OpenCV GPU 时如何访问像素信息。我目前正在将 gpu::mat 信息下载到 mat 变量中,但速度太慢。 有人知道怎么做吗?

【问题讨论】:

  • 你不能,你必须先下载它。它位于 GPU 内存中,您无法通过 OpenCV API 访问。
  • 谢谢大卫!你知道任何使用 GPU 内存的 CUDA 代码吗?

标签: opencv gpu


【解决方案1】:

您可以访问内核中的数据。

对于 (row,col) 行列号, 通道号 ch

uint8_t val = gpumat.data[ (row*gpumat.step) + col*gpumat.channels() + ch];

假设你有一个 BGR 输入图像存储在一个名为 src 的 GpuMat 上,你想要 将每个像素值分配给名为 dst(也称为 GpuMat)的目标图像。 你可以调用内核

    kernel_assign_pixel<<<gridDim, blockDim>>>
(src.data, dst.data, src.rows, src.cols, src.step, dst.step, src.channels());

定义如下

    __global__ void kernel_assign_pixel
(uint8_t* src, uint8_t* dst, int MaxRows, int MaxCols, int iStep, int oStep, int MaxC)
        {

        unsigned int row = blockIdx.x * blockDim.x + threadIdx.x; //Row number
        unsigned int col = blockIdx.y * blockDim.y + threadIdx.y; //Column number
        unsigned int ch = blockIdx.z * blockDim.z + threadIdx.z; //Channel number

            if (row<MaxRows && col<MaxCols && ch < MaxC)
            {
                int tidIn = row * iStep + col * MaxC  + ch;
                int tidOut = row * oStep + col * MaxC + ch;

                dst[tidOut]=src[tidIn];
            }
        }

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多