首页 > 解决方案 > 提取一个连续的 OpenCV cuda::GpuMat?

问题描述

我正在尝试将推力算法应用于 cuda::GpuMats 中的数据。不幸的是,OpenCV 基本上从不产生连续的 GpuMat(这几乎破坏了我所有的算法、代码、性能等......)。通常,当我遇到这种主矩阵不连续的场景时,我只是克隆矩阵,通常当矩阵来自另一个矩阵的矩形视图时,主侧矩阵变得不连续。

这...不适用于 gpu 垫。从字面上看,似乎从来没有连续出现。我不确定 OpenCV 到底发生了什么。我正在做的事情如下:

cv::Mat host(600,400); 
cv::gpu::GpuMat device;
device.upload(host);

cv::gpu::GpuMat continuous;

if(device.isContinuous()){
    continuous = device;
}else{
    continuous = device.clone();
}


//always prints... 
if(!continuous.isContinuous()){
    std::cout << "isn't Continuous\n";
}

如您所见,仅上传数据的行为就会产生不连续的数据......

标签: c++opencvmatrixgpu

解决方案


嗨,亲爱的,
要生成连续的 GpuMat,您可以使用以下方法之一:

  1. 使用cv::cuda::createContinuous(int rows, int cols, int type, continuous_gpumat)或其重载。
  2. 使用 cuda api 调用或类似函数分配一个连续的 Cuda 内存cudaMalloc,然后为这个连续的缓冲区构造一个GpuMat 头: // 在析构函数中:
    // elem_size is depent on data type
    int alloc_size = rows*cols*elem_size;
    uchar *data = nullptr; cudaError_t status = cudaMalloc(&data, alloc_size);
    assert(status==cudaSuccess);
    continuous_gpumat = cv::cuda::GpuMat(rows, cols, type, data);

    status = cudaFree(data);
    assert(status==cudaSuccess);

推荐阅读