Как преобразовать данные видеопотока в cv :: gpumat? - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужно преобразовать данные видеопотока в cv :: gpumat. Сначала я попытался скопировать в cv :: Mat, а затем использовать загрузку, чтобы загрузить его в gpumat. Этот процесс очень медленный (20 мс для кадра 640 * 480).

Мне нужен метод для прямого преобразования видеопотока openni в gpumat. Я попробовал следующий код, но он дает ошибку времени выполнения

Я использую opencv3.1, cuda-8.0, gtx titanx на Ubuntu 16.04

#include "opencv2/opencv_modules.hpp"
#include <opencv2/core.hpp>
#include <opencv2/cudacodec.hpp>
#include <opencv2/highgui.hpp>

int main(int argc, const char* argv[])
{
    const std::string fname = argv[1];

    cv::cuda::GpuMat d_frame;
    cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);

    for (;;)
    {
        if (!d_reader->nextFrame(d_frame))
            break;

        cv::Mat frame;
        d_frame.download(frame);
        cv::imshow("GPU", frame);

        if (cv::waitKey(3) > 0)
            break;
    }
    return 0;
}

OpenCV Error: The function/feature is not implemented (The called functionality is disabled for current build or platform) in throw_no_cuda, file /home/krr/softwares/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp, line 101
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/krr/softwares/opencv-3.1.0/modules/core/include/opencv2/core/private.cuda.hpp:101: error: (-213) The called functionality is disabled for current build or platform in function throw_no_cuda

1 Ответ

0 голосов
/ 07 ноября 2018

Взгляните на исходный код . Каркас называется "throw_no_cuda ()" (строки разные, версия?). Также ошибка, кажется, дублирует этот на github.

alalek:
https://developer.nvidia.com/nvidia-video-codec-sdk:

Примечание. Для Video Codec SDK 7.0 и более поздних версий NVCUVID был переименован в NVDECODE API.

OpenCV не поддерживает новый API и не планирует добавлять это. Последняя версия CUDA с NVCUVID - ~ CUDA 6.5.

Рассмотрите возможность использования ffmpeg с включенными функциями CUDA (через обычный cv :: VideoCapture, но он не может работать с cv :: GpuMat в CUDA).

и далее:

dapicard:
Я нашел способ определить кодек, используемый бэкэндом FFMpeg:

экспорт OPENCV_FFMPEG_CAPTURE_OPTIONS = "video_codec | h264_cuvid"

В более общем смысле можно определить эти параметры, используя синтаксис имя_параметра | значение; имя_параметра2 | значение2

То есть использовать аппаратные возможности для декодирования видео (которое вы пробовали). Sidenote: ffmpeg также предлагает опции для перекодирования видео непосредственно в GPU (то есть без перемещения кадров из памяти GPU).
Честно говоря, использование предложенного метода не приведет к прямой доставке матрицы в память вашего GPU, а только устранит ошибку. Я не думаю, что можно получить память напрямую из ffmpeg напрямую, так что вы застряли в ее перемещении.

...