c++ - 提取一个连续的 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";
}
如您所见,仅上传数据的行为就会产生不连续的数据......
解决方案
嗨,亲爱的,
要生成连续的 GpuMat,您可以使用以下方法之一:
- 使用
cv::cuda::createContinuous(int rows, int cols, int type, continuous_gpumat
)或其重载。 - 使用 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);
推荐阅读
- reactjs - 将 Promise 传递给 reducer 并在那里解决它是一件坏事吗?
- java - Android Studio 中没有立即设置可见性
- log4net - log4net 是否有接受级别作为参数的消息写入方法?
- python - 从 html 中删除不匹配的结束标记
- arrays - MongoDB中数组中的字符串字段值长度
- influxdb - Telegraf 文件计数值未显示在 influxdb 中
- javascript - 如何创建默认在新窗口中打开的浏览器书签?
- ios - 在 Xcode 10 中添加自定义 UITableViewController 标头
- javascript - Wordpress:将所有帖子的子子类别设为“主要”
- c++ - 尝试加载 dll 时总是收到 126 LoadLibrary 错误