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

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