在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。
这里是我自己的操作,请谨慎!!!
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再卸载
如果没有输出版本号,则已经完成卸载
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再卸载
如果没有输出版本号,则已经完成卸载
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
vi /etc/profile
加入以下内容:
export PATH="/usr/local/ffmpeg/bin:$PATH"
保存并运行
source /etc/profile
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
mkdir -p ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd ~/opencv_build/opencv && mkdir build && cd build
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命令查看
sudo make install
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