在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