Opencv Hardware Decode/Encode

1.Opencv Opencv Hardware Decode Environment Configuration

cmake \
     -D CMAKE_INSTALL_PREFIX=/DATACENTER1/workspace/libs/opencv2 \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D WITH_CUDA=ON \
    -D WITH_CUBLAS=ON \
    -D CUDA_FAST_MATH=ON \
    -D WITH_OPENGL=ON \
    -D WITH_CUFFT=ON \
    -D WITH_NVCUVID=ON \
    -D HAVE_FFMPEG=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_V4L=ON \
    -D WITH_LIBV4L=ON \
    -D BUILD_OPENCV_CUDACODEC=ON \
    -D CUDA_GENERATION=Auto \
    ..

    -D FFMPEG_INCLUDE_DIRS="/DATACENTER1/zexin.wang/shanxi_docker/libs_/ffmpeg/lib/pkgconfig" \
   
在文件中查找關(guān)鍵詞
grep -rl "FFMPEG_INCLUDE_DIRS" ./

 -D FFMPEG_INCLUDE_DIR="/DATACENTER1/zexin.wang/shanxi_docker/libs_/ffmpeg/include" \
    -D FFMPEG_LIB_DIR="/DATACENTER1/zexin.wang/shanxi_docker/libs_/ffmpeg/lib" \

1.2 Problem 1

CMake Warning at cmake/OpenCVPackaging.cmake:23 (message):
  CPACK_PACKAGE_VERSION does not match version provided by version.hpp
  header!
Call Stack (most recent call first):
  CMakeLists.txt:1103 (include)

Solution 1

1.2 Problem 2

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
opencv_dep_CUDA_nppi_LIBRARY

Solution 2:

https://blog.csdn.net/u014613745/article/details/78310916
解決方案如下:

1).找到FindCUDA.cmake文件

找到行

find_cuda_helper_libs(nppi)

改為

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)

2).找到行

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

改為:

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

3).找到行

unset(CUDA_nppi_LIBRARY CACHE)

改為:

unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)

4)由于cuda9.0不支持2.0馏颂,所以弦讽,在該目錄下找到OpenCVDetectCUDA.cmake文件:
將內(nèi)容

set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")

修改為:(去掉2.0)

set(__cuda_arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

1.3 Problem 3

In file included from /DATACENTER1/workspace/libs/opencv-2.4.13.6/build/modules/gpu/opencv_gpu_pch_dephelp.cxx:1:0:
/DATACENTER1/workspace/libs/opencv-2.4.13.6/modules/gpu/src/precomp.hpp:98:29: fatal error: nvcuvid.h: 沒有那個文件或目錄
compilation terminated.

Solution 3

(1)拷貝Video_Codec_SDK下的 cuviddec.h nvcuvid.h兩個文件到/opencv-2.4.13.6/modules/gpu/src

cp -f /DATACENTER1/zexin.wang/shanxi_docker/Video_Codec_SDK_9.0.20/include/nvcuvid.h .
cp -f /DATACENTER1/zexin.wang/shanxi_docker/Video_Codec_SDK_9.0.20/include/cuviddec.h .

1.4 Problem 4

Unsupported gpu architecture 'compute_20'

Solution4

在cmake的時候添加

-D CUDA_GENERATION=Auto

Problem 1.5

無法與ffmpeg交叉編譯乳规,ffmpeg的庫不是全局的
將下面添加到~/.bashrc

export PKG_CONFIG_PATH=/DATACENTER1/zexin.wang/shanxi_docker/libs_/ffmpeg/lib/pkgconfig:$PKG_CONFIG_PATH

但還是遇到問題


最后暴力出奇跡

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

1.6 Final

make -j12
make install

2.Opencv Hardware Decode Example

參考文章:OpenCV gpu模塊樣例注釋:video_reader.cpp

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
 
#include <opencv2/core/core.hpp>
#include <opencv2/core/opengl_interop.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/contrib/contrib.hpp>
 
int main(int argc, const char* argv[])
{
    if (argc != 2)
        return -1;
 
  // 首先要檢查是否CUDA模塊是否可用
    if(cv::gpu::getCudaEnabledDeviceCount()==0){
        cerr<<"此OpenCV編譯的時候沒有啟用CUDA模塊"<<endl;
        return -1;
    }

    const std::string fname(argv[1]);//文件名
 
    cv::namedWindow("CPU", cv::WINDOW_NORMAL);//創(chuàng)建顯示CPU讀入圖像的窗口
    cv::namedWindow("GPU", cv::WINDOW_OPENGL);//創(chuàng)建顯示GPU讀入圖像的窗口
    cv::gpu::setGlDevice();//設(shè)置CUDA并且為當(dāng)前使用OpenGL的進程初始化,參數(shù)默認為0
 
    cv::Mat frame;//用于存儲CPU讀入圖像的數(shù)組
    cv::VideoCapture reader(fname);//實例化一個 用CPU從文件組讀入視頻的類
 
    cv::gpu::GpuMat d_frame;//用于存儲GPU讀入圖像的數(shù)組
    cv::gpu::VideoReader_GPU d_reader(fname);//實例化一個 用GPU從文件組讀入視頻的類
    d_reader.dumpFormat(std::cout);//輸出視頻幀信息
 
    cv::TickMeter tm;
    std::vector<double> cpu_times;
    std::vector<double> gpu_times;
 
    for (;;)
    {
        tm.reset(); tm.start();//計算CPU讀入一幀的時間
        if (!reader.read(frame))
            break;
        tm.stop();
        cpu_times.push_back(tm.getTimeMilli());
 
        tm.reset(); tm.start();//計算GPU讀入一幀的時間
        if (!d_reader.read(d_frame))
            break;
        tm.stop();
        gpu_times.push_back(tm.getTimeMilli());
 
        cv::imshow("CPU", frame);//顯示CPU讀入的視頻
        cv::imshow("GPU", d_frame);//顯示GPU讀入的視頻
 
        if (cv::waitKey(3) > 0)//如果等待時間大于3桃序,就終止讀入視頻
            break;
    }
 
    if (!cpu_times.empty() && !gpu_times.empty())//如果時間不為空
    {
        std::cout << std::endl << "Results:" << std::endl;
 
        std::sort(cpu_times.begin(), cpu_times.end());//排序
        std::sort(gpu_times.begin(), gpu_times.end());
 
        double cpu_avg = std::accumulate(cpu_times.begin(), cpu_times.end(), 0.0) / cpu_times.size();//求CPU讀入一幀的平均時間
        double gpu_avg = std::accumulate(gpu_times.begin(), gpu_times.end(), 0.0) / gpu_times.size();//求GPU讀入一幀的平均時間
 
        std::cout << "CPU : Avg : " << cpu_avg << " ms FPS : " << 1000.0 / cpu_avg << std::endl;//輸出平均時間和幀頻
        std::cout << "GPU : Avg : " << gpu_avg << " ms FPS : " << 1000.0 / gpu_avg << std::endl;
    }
 
    return 0;
}

Makefile參考

INC_ROOT := /DATACENTER1/oil_project/oil_support/external/libs
BOOST := $(INC_ROOT)/boost
OPENCV := /DATACENTER1/workspace/libs/opencv2
GLOG := $(INC_ROOT)/glog
GFLAG := $(INC_ROOT)/gflag

STREAMER_OPENCV := ./streamer_opencv

COMMON :=/DATACENTER1/oil_project/oil_support/common

INC_DIR := $(BOOST)/include $(OPENCV)/include $(GLOG)/include $(STREAMER_OPENCV) 

LIB_DIR := $(GLOG)/lib $(BOOST)/lib $(GFLAG)/lib $(OPENCV)/lib
TAG_DIR := .

EXECUTABLE := $(TAG_DIR)/streamer
LIBS := pthread opencv_video opencv_core opencv_imgproc opencv_highgui opencv_contrib opencv_gpu \
glog gflags boost_program_options boost_thread boost_filesystem boost_system boost_date_time rt dl z#lzma # nvcuvid cuda
#ACEX_MACROS := -DACEX_NTRACE

CFLAGS := -g -Wall -fopenmp -m64 -w
CXXFLAGS := $(CFLAGS)
CPPFLAGS += $(addprefix -I, $(INC_DIR)) 
ARFLAGS :=

# CXX := /DATACENTER1/zexin.wang/gcc-9.2.0/build/bin/$(CXX)

RM-F := rm -f

SOURCE := $(wildcard *.c) $(wildcard *.cpp) $(wildcard ${STREAMER_OPENCV}/*.cpp)

OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) $(patsubst %.d,%.cpp,$(MISSING_DEPS)))
CPPFLAGS += -MD -std=c++11 

.PHONY : everything deps objs clean veryclean rebuild

everything : $(EXECUTABLE)

deps : $(DEPS)

objs : $(OBJS)

clean :
        @$(RM-F) */*/*/*/*.o
        @$(RM-F) */*/*/*/*.d
        @$(RM-F) */*/*/*.o
        @$(RM-F) */*/*/*.d
        @$(RM-F) */*/*.o
        @$(RM-F) */*/*.d
        @$(RM-F) */*.d
        @$(RM-F) */*.o

veryclean: clean
        @$(RM-F) $(EXECUTABLE)

rebuild: veryclean everything


ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
        @$(RM-F) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(EXECUTABLE) : $(OBJS) 
        rm -f $@
        $(CXX) -o $(EXECUTABLE) $(OBJS) $(addprefix -L, $(LIB_DIR)) $(addprefix -l, $(LIBS)) -fopenmp
        @$(RM-F) *.o
        @$(RM-F) *.d


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛾扇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萧豆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昏名,死亡現(xiàn)場離奇詭異涮雷,居然都是意外死亡,警方通過查閱死者的電腦和手機轻局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門洪鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仑扑,你說我怎么就攤上這事览爵。” “怎么了镇饮?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵蜓竹,是天一觀的道長。 經(jīng)常有香客問我储藐,道長俱济,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任邑茄,我火速辦了婚禮姨蝴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肺缕。我一直安慰自己左医,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布同木。 她就那樣靜靜地躺著浮梢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彤路。 梳的紋絲不亂的頭發(fā)上秕硝,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音洲尊,去河邊找鬼远豺。 笑死,一個胖子當(dāng)著我的面吹牛坞嘀,可吹牛的內(nèi)容都是我干的躯护。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼丽涩,長吁一口氣:“原來是場噩夢啊……” “哼棺滞!你這毒婦竟也來了裁蚁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤继准,失蹤者是張志新(化名)和其女友劉穎枉证,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移必,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡室谚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崔泵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞萄。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖管削,靈堂內(nèi)的尸體忽然破棺而出倒脓,到底是詐尸還是另有隱情,我是刑警寧澤含思,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布崎弃,位于F島的核電站,受9級特大地震影響含潘,放射性物質(zhì)發(fā)生泄漏饲做。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一遏弱、第九天 我趴在偏房一處隱蔽的房頂上張望盆均。 院中可真熱鬧,春花似錦漱逸、人聲如沸泪姨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肮砾。三九已至,卻和暖如春袋坑,著一層夾襖步出監(jiān)牢的瞬間仗处,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工枣宫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婆誓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓也颤,卻偏偏與公主長得像洋幻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歇拆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355