1.首先編譯了opencv + cuda
編譯選項中使用了以下關於cuvid庫的內容:
//"nvcuvid" library
CUDA_nvcuvid_LIBRARY:FILEPATH=/usr/local/lib/libnvcuvid.so
//Path to a library.
CUDA_rt_LIBRARY:FILEPATH=/usr/local/cuda-9.0/lib64/libcudart_static.a
//Include NVidia Video Decoding library support
WITH_NVCUVID:BOOL=ON
2.下載了這個opencv + cuvid視頻解碼例子:
https://github.com/opencv/opencv/blob/master/samples/gpu/video_reader.cpp
編譯和鏈接命令行:
g++ -c video_reader.cpp -o video_reader.o -g -I"/home/admin/opencv/2019-05-09_cuda/include/opencv4/" -std=c++11 g++ -o video_reader video_reader.o -L"/home/admin/opencv/2019-05-09_cuda/lib64/" -lopencv_core -lopencv_videoio -lopencv_cudacodec -lopencv_imgproc -lopencv_imgcodecs -lopencv_flann -lopencv_img_hash -lopencv_photo -L"/usr/local/cuda/lib64/stubs" -lcuda -lcublas -L"/usr/local/cuda/lib64" -lcudart -L"/usr/local/lib/" -lnvcuvid -lz -ldl -lpthread -lopencv_imgcodecs -lopencv_core -lopencv_imgcodecs -L"/home/admin/opencv/2019-05-09_cuda/lib64/opencv4/3rdparty" -lIlmImf -lopencv_core -lopencv_imgproc
3. 運行程序,出現coredump,GPU驅動的版本是 384.81
./video_reader stand_input.mp4
Program received signal SIGSEGV, Segmentation fault.
堆棧信息如下:
(gdb) bt #0 0x00000000007eb4aa in cv::cudacodec::detail::CuvidVideoSource::CuvidVideoSource ( this=0x1731810, fname=...) at /home/admin/opencv/opencv_contrib-master/modules/cudacodec/src/cuvid_video_source.cpp:63 #1 0x00000000007e6943 in cv::cudacodec::createVideoReader (filename=...) at /home/admin/opencv/opencv_contrib-master/modules/cudacodec/src/video_reader.cpp:206 #2 0x000000000040e0cb in main (argc=2, argv=0x7fffffffe5a8) at video_reader.cpp:33 (gdb) f 0 #0 0x00000000007eb4aa in cv::cudacodec::detail::CuvidVideoSource::CuvidVideoSource ( this=0x1731810, fname=...) at /home/admin/opencv/opencv_contrib-master/modules/cudacodec/src/cuvid_video_source.cpp:63 63 CUresult cuRes = cuvidCreateVideoSource(&videoSource_, fname.c_str(), ¶ms);
4. 搜索了一下,這篇帖子貌似提供了解決辦法:
https://github.com/opencv/opencv/issues/10201
'Segmentation fault' with gpu video decoding #10201
下一步嘗試自己下載一個 Video_Codec_SDK 庫來替換系統自帶的版本。
====================
2019-05-12補充:
按照以上帖子的提示,下載 Video_Codec_SDK_8.0.14.zip
unzip Video_Codec_SDK_8.0.14.zip
/home/admin/cuvid/Video_Codec_SDK_8.0.14/Samples
make
# make 出現錯誤,沒關系, dynlink_nvcuvid.o生成就好了
代碼的頭文件中include Video_Codec_SDK_8.0.14/Samples/common/inc/dynlink_nvcuvid.h
然后代碼中加上:cuda_res = cuvidInit(0);
最后,鏈接的路徑中加上: "Video_Codec_SDK_8.0.14/Samples/NvDecodeGL/dynlink_nvcuvid.o" -L"/usr/local/nvidia/lib64/" -lnvcuvid
運行成功
然后又遇到了GpuMat的格式問題,請看下一篇!