Как создать тягу device_vector из opencv gpumat - PullRequest
0 голосов
/ 14 октября 2018

Мне нужно конвертировать 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

Thrust 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;
}

1 Ответ

0 голосов
/ 15 октября 2018

Как преобразовать из cv :: gpumat в thrust :: device_vector ....

Это невозможно сделать.Thrust не предоставляет механизм для создания device_vector из существующего указателя.Копирование является единственным способом создания экземпляра device_vector из существующих данных.

.... и наоборот?

Это можно сделать:

  1. Приведите device_vector к необработанному указателю (см. здесь )
  2. Создайте экземпляр openCV gpumat из необработанного указателя (см. здесь )

Имейте в виду, что если вы позволите device_vector выпасть из области видимости, будет вызван его деструктор, и память, которая его поддерживает (и все, что использует ту же память), будетосвобожден, и вы находитесь на неопределенной территории поведения.

...