如何从 opencv gpumat 创建推力 device_vector

How to create thrust device_vector from opencv gpumat

我需要将 opencv::gpumat 转换为 thrust::device_vector,然后执行 thrust::copy_if,然后再次将结果 thrust::device_vector 复制到 cv::gpumat。

如何将 cv::gpumat 转换为 thrust::device_vector,反之亦然?

我的代码(如下)给出了编译错误: 错误:需要类型说明符

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609

nvcc:Cuda 编译工具,版本 8.0,V8.0.44

推力 v1.8

ubuntu 16.04

我的代码:

#include <thrust/random.h>

#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>

#include <opencv2/core/cuda.hpp>

int main(void)
{
    cv::Mat input_host(1,100,CV_32F);
    cv::Mat output_host(1,100,CV_32F);

    cv::randu(input_host, cv::Scalar(-10), cv::Scalar(10));
    cv::cuda::GpuMat input_device(1, 100, CV_32F);
    input_device.upload(input_host);

    thrust::device_ptr<CV_32F> input_ptr(input_device.ptr());

    thrust::device_vector<CV_32F>   input_device_vector  (input_ptr,100);
    return 0;
}

How to convert from cv::gpumat to thrust::device_vector ....

这是不可能的。 Thrust 没有公开从现有指针构造 device_vector 的机制。复制构造是 device_vector 可以从现有数据实例化的唯一方法。

.... & vice-versa?

这可以做到:

  1. device_vector 转换为原始指针(参见 here
  2. 从原始指针创建一个 openCV gpumat 实例(参见 here

请注意,如果您让 device_vector 超出范围,它的析构函数将被调用,支持它的内存(以及使用相同内存的任何其他东西)将被释放,您将进入未定义的行为领域。