CentOS8編譯OpenCV4.3.0 with ffmpeg(YoloV4處理視頻並保存)

darknet-Yolo:How to use中有一條命令
Yolo v4 - save result videofile res.avi: darknet.exe(./darknet) detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi

但在我運行這條命令時,一直輸出Video-stream stopped。貌似視頻內容一直沒有被成功讀取,後來在issue中得到了提示,大概是因爲我的OpenCV是直接從Centos8的dnf資源庫中下載安裝的,沒有將ffmpeg編譯進去,所以對視頻不能解碼讀取。

接下來是如何在CentOS8編譯OpenCV4.3.0 with ffmpeg。

卸載已安裝OpenCV

這裏是我自己的操作,請謹慎!!!

卸載源碼編譯的opencv

  • 找到當初安裝的opencv的build目錄,進入build目錄執行以下操作:
sudo make uninstall
cd ..
rm -Rf build
cd /usr
find . -name "*opencv*" | xargs sudo rm -rf
yum remove opencv-data python-opencv
  • 查看系統是否還能檢測到opencv
    運行pkg-config --modversion opencv,如果沒有版本號輸出,那就是對的

  • 查看Python內部opencv是否已經卸載
    運行以下命令:

python
>>import cv2
>>cv2.__version__

如果輸出了opencv版本號,則需要用pip安裝opencv再卸載
如果沒有輸出版本號,則已經完成卸載

卸載直接從dnf資源庫下載安裝的opencv

  • 運行以下命令
cd /usr
find . -name "*opencv*" | xargs sudo rm -rf
yum remove opencv
  • 查看系統是否還能檢測到opencv
    運行pkg-config --modversion opencv,如果沒有版本號輸出,那就是對的

  • 查看Python內部opencv是否已經卸載
    運行以下命令:

python
>>import cv2
>>cv2.__version__

如果輸出了opencv版本號,則需要用pip安裝opencv再卸載
如果沒有輸出版本號,則已經完成卸載

安裝ffmpeg

  • 下載ffmpeg源碼
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
  • 編譯
cd source_directory
./configure --enable-shared --disable-static --disable-x86asm
make
sudo make install

有可能會出現以下報錯:

error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory

解決辦法:

sudo vi /etc/ld.so.conf

修改如下:

include ld.so.conf.d/*.conf
/usr/local/ffmpeg/lib

修改好保存在運行:

sudo ldconfig

也有可能出現如下報錯:

usr/local/cuda-10.0/lib64/libcudnn.so.7.5 不是符號連接的問題

解決辦法:重新建立鏈接並刪除原鏈接

首先找到usr/local/cuda-10.0/lib64/目錄,搜索 libcudnn 然後發現兩個文件
libcudnn.so.7.5 和libcudnn.so.7.5.0 理論上只有一個libcudnn.so.7.5.0

終端執行:

ln -sf /usr/local/cuda-10.0/lib64/libcudnn.so.7.5.0 /usr/local/cuda-10.0/lib64/libcudnn.so.7.5
sudo ldconfig
  • 驗證安裝是否成功
ffmpeg -version
  • 將ffmpeg加入環境變量
    編輯 /etc/profile
vi /etc/profile

加入以下內容:

export PATH="/usr/local/ffmpeg/bin:$PATH"

保存並運行

source /etc/profile

編譯OpenCV

安裝必需和可依賴項

sudo dnf install epel-release git gcc gcc-c++ cmake3 qt5-qtbase-devel     python3 python3-devel python3-pip cmake python3-devel python3-numpy     gtk2-devel libpng-devel jasper-devel openexr-devel libwebp-devel     libjpeg-turbo-devel libtiff-devel tbb-devel libv4l-devel     eigen3-devel freeglut-devel mesa-libGL mesa-libGL-devel     boost boost-thread boost-devel gstreamer1-plugins-base

下載OpenCV源碼和OpenCV-Contrib源碼

mkdir -p ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

開始編譯

  • 創建一個臨時構建目錄build
cd ~/opencv_build/opencv && mkdir build && cd build
  • 使用cmake命令配置opencv構建
cmake3 -D CMAKE_BUILD_TYPE=RELEASE     -D CMAKE_INSTALL_PREFIX=/usr/local     -D INSTALL_C_EXAMPLES=ON     -D INSTALL_PYTHON_EXAMPLES=ON     -D OPENCV_GENERATE_PKGCONFIG=ON     -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules     -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON ..

輸出內容看一下ffmpeg選項如下:

FFMPEG:                      YES
      avcodec:                   YES (ver 56.60.100)
      avformat:                  YES (ver 56.40.101)
      avutil:                    YES (ver 54.31.100)
      swscale:                   YES (ver 3.1.101)
      avresample:                YES (ver 2.1.0)

末尾如下:

-- Configuring done
-- Generating done
-- Build files have been written to: /home/opencv_build/opencv/build
  • 開始編譯
make -j8	#-j後面的8是處理器的內核數,可以通過鍵入nproc命令查看
  • 安裝opencv庫
sudo make install
  • 創建一個符號鏈接opencv4.pc提交/usr/share/pkgconfig 目錄和執行 ldconfig 重建庫緩存。
sudo ln -s /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/
sudo ldconfig
  • 驗證是否安裝成功
pkg-config --modversion opencv4

輸出版本號4.3.0

python3 -c "import cv2; print(cv2.__version__)"

輸出4.3.0-dev

至此,opencv with ffmpeg就編譯完成了。

重新編譯darknet源碼,執行以下命令:

./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.avi -out_filename res.avi

出現如下報錯:

./darknet error while loading shared libraries: libopencv_gapi.so.4.3:cannot open shared object file

參考issue
解決方法:

locate libopencv_gapi.so.4.3

輸出如下:

/root/opencv_build/opencv/build/lib/libopencv_gapi.so.4.3
/root/opencv_build/opencv/build/lib/libopencv_gapi.so.4.3.0
/usr/local/lib64/libopencv_gapi.so.4.3
/usr/local/lib64/libopencv_gapi.so.4.3.0

查看etc/ld.so.conf.d/opencv.conf,發現裏面只有/usr/local/lib這個路徑,而這個路徑下沒有libopencv-gapi.so.4.3文件,所以報錯,我們只需要將/usr/local/lib64添加進去即可,運行下面命令:

sudo gedit /etc/ld.so.conf.d/opencv.conf

在文件中添加/usr/local/lib64,保存關閉,運行

sudo ldconfig -v

這樣就可以了。

參考文章:
Ubuntu16.04卸載其他版本的opencv並安裝opencv3.2.0+opencv contrib3.2.0
linux下opencv with ffmpeg安裝
ubuntu下opencv+ffmpeg安裝 以及錯誤處理
從源代碼安裝OpenCV

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章