【发布时间】:2020-06-29 08:54:50
【问题描述】:
我的环境信息:
- 操作系统:Ubuntu 18.04
- OpenCV:4.3.0
- CUDA:10.2
- NVIDIA GPU:GEFORCE RTX 2060
安装opencv前我的cmake列表:
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D INSTALL_C_EXAMPLES=ON
-D INSTALL_PYTHON_EXAMPLES=OFF
-D WITH_TBB=ON \ -D WITH_CUDA=ON
-D CUDA_GENERATION=图灵\-D BUILD_opencv_cudacodec=ON
-D ENABLE_FAST_MATH=ON
-D NVCUVID_FAST_MATH=ON
-D CUDA_FAST_MATH=ON
-D WITH_CUBLAS=ON
-D BUILD_opencv_java=OFF
-D BUILD_ZLIB=ON
-D BUILD_TIFF=ON
-D WITH_GTK=ON
-D WITH_NVCUVID=ON
-D WITH_FFMPEG=ON
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2
-D WITH_1394=开启
-D CUDNN_INCLUDE_DIR=/usr/local/cuda/include
-D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so.7.6.5
-D OPENCV_GENERATE_PKGCONFIG=ON
-D OPENCV_PC_FILE_NAME=opencv4.pc
-D OPENCV_ENABLE_NONFREE=ON
-D WITH_GSTREAMER=ON
-D WITH_V4L=ON
-D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-4.3.0-py3/lib/python3.5/site-packages
-D WITH_QT=ON
-D WITH_CUDNN=ON
-D OPENCV_DNN_CUDA=ON
-D WITH_OPENGL=ON
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules
-D BUILD_EXAMPLES=ON ..
Cmake后的一部分输出:
. .
-- Video I/O:
-- DC1394: YES (2.2.5)
-- FFMPEG: YES
-- avcodec: YES (57.107.100)
-- avformat: YES (57.83.100)
-- avutil: YES (55.78.100)
-- swscale: YES (4.8.100)
-- avresample: YES (3.7.0)
-- GStreamer: YES (1.14.5)
-- v4l/v4l2: YES (linux/videodev2.h)
--
-- Parallel framework: TBB (ver 2017.0 interface 9107)
--
-- Trace: YES (with Intel ITT)
--
-- Other third-party libraries:
-- Intel IPP: 2020.0.0 Gold [2020.0.0]
-- at: /home/yongatek02/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
-- Intel IPP IW: sources (2020.0.0)
-- at: /home/yongatek02/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
-- Lapack: NO
-- Eigen: YES (ver 3.3.4)
-- Custom HAL: NO
-- Protobuf: build (3.5.1)
--
-- NVIDIA CUDA: YES (ver 10.2, CUFFT CUBLAS NVCUVID FAST_MATH)
-- NVIDIA GPU arch: 75
-- NVIDIA PTX archs:
--
-- cuDNN: YES (ver 7.6.5)
--
-- OpenCL: YES (no extra features)
-- Include path: /home/yongatek02/opencv/3rdparty/include/opencl/1.2
-- Link libraries: Dynamic load . .
我测试了简单的 cuda 示例和 OpenCV,并且工作正常没问题。我尝试this example 能够使用 GPU 解码我的 IP 摄像机流。它通过终端上的这个命令编译得很好:
g++ -std=c++11 codec.cpp `pkg-config --libs --cflags opencv4` -o output
这也是我的代码:
#include <opencv2/opencv_modules.hpp>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/cudacodec.hpp>
#include <opencv2/highgui.hpp>
int main(int argc, const char* argv[])
{
const std::string fname = "rtsp://usrname/ipadress..."; // Tried also different formats of videos such as YUV,mp4 webM
cv::namedWindow("GPU", cv::WINDOW_NORMAL);
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;
}
但是当我尝试运行它时,它给了我这个错误:
在抛出 'cv::Exception' 实例后调用终止
什么():OpenCV(4.3.0) /home/yongatek02/opencv_contrib/modules/cudacodec/src/video_decoder.cpp:101: 错误:(-210:不支持的格式或格式组合)视频 函数'create'中的硬件视频解码器不支持源中止(核心转储)
我也尝试过使用一些不同类型的格式,如YUV、MP4、webm等,还是报错。
我在这里缺少什么?
【问题讨论】:
-
你能在没有 CUDA 的情况下从 RTSP 读取流吗?
-
@farbiondriven 我可以通过 VideoCapture 或 VLC 读取,我也可以读取流和显示。
-
@talonmies 为什么你认为我的问题与 cuda 没有关系?
-
好的,所以流本身一切正常。我的问题更多:您可以使用 opencv 本身而不是 cuda 读取流吗?我认为确实问题在于将流绑定到 CUDA 阅读器。
-
@farbiondriven 我可以使用一些带有 opencv 函数的示例,例如
cv::cuda::findcontours...。这意味着 cuda 安装正确。是的,没有 cuda,因为没有通过 cuda 上的视频捕获读取的选项。唯一的方法是使用 createVideoReader 但它也失败了。我不知道错误在哪里。我还安装了 NVIDIA Video Codec SDK 以便能够使用 NVCUVID。但仍然失败..
标签: c++ opencv ubuntu-18.04 nvidia