之前自己从未考虑过这个问题,每次在手动编译OpenCV的时候,cmake
后面的-D xxx
对我来说只是添加了某个支持,但是我并不知道,OpenCV编译也是用CMakeLists
...而找到这些依赖是依靠 pkgconfig 工具和*.pc
文件。
文章最下方是我在编译OpenCV时使用的cmake
命令,其中没有添加对FFMPEG的支持。
完全编译完并sudo make install
后,我的OpenCV甚至不能读取视频,这是因为OpenCV用于图像处理,而FFMPEG用于视频的采集、编解码和stream的处理。所以OpenCV的cv::VideoCapture
能够读取视频流是因为其提供了FFMPEG相关的API。此外,看着某些文章的意思,OpenCV似乎也可以通过其他方式采集和解码视频流,不过使用什么库就不知道了...
既然如此,我在cmake
命令中增加了-D WITH_FFMPEG \
,寻思着大功告成力!于是开始摸鱼,编译完后,程序依旧运行不起来...
在terminal中输入ffmpeg
,能正确显示其版本,而且两台设备的版本也一致,看来是事先预装的,所以只能是安装有问题。先把FFMPEG卸载:sudo apt autoremove ffmpeg
所以我找到了 https://github.com/jocover/jetson-ffmpeg 仓库,按照其中的方法安装。在第二步./configure --enable-nvmpi
,一直在报错,而nvmpi
这个依赖确实是存在于设备上的。不过nvmpi
似乎是Nvidia加速视频解码转码,所以舍弃也OK。
Note 1:FFMPEGmake
完成后,记得sudo make install
安装,不然还是可能找不到这个库。
Note 2:接下来编译OpenCV时,在cmake
结果中可以看到是否支持FFMPEG,即FFMPEG :YES
Note 3:make
OpenCV时如果报错是由于某些Shared or Static Lib的原因(忘记截图),则为./configure
添加 --disable-static --enable-shared
Note 4:有教程提到编译FFMPEG前要下载FFMPEG依赖,比如avcodec-dev
,libswscale-dev
等。其实不需要,可能会影响后面的编译。
Note5:可能报错 : libavdevice.so.58: cannot open shared object file: No such file or directory
,是因为没有链接到库,vim /etc/ld.so.conf
后添加/usr/local/lib
,再sudo ldconfig
即可。
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D CMAKE_C_COMPILER=/usr/bin/gcc-9 \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python3=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D WITH_TBB=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN=8.9 \
-D WITH_CUBLAS=1 \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/funnywii/opencv_contrib-4.7.0/modules \
-D PYTHON3_EXECUTABLE=/home/funnywii/Anaconda3/bin/python3.10 \
-D PYTHON3_INCLUDE_DIR=/home/funnywii/Anaconda3/include/python3.10 \
-D PYTHON3_LIBRARY=/home/funnywii/Anaconda3/lib/libpython3.10.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/funnywii/Anaconda3/lib/python3.10/site-packages/numpy/core/include \
-D PYTHON3_PACKAGES_PATH=/home/funnywii/Anaconda3/lib/python3.10/site-packages \
-D PYTHON_DEFAULT_EXECUTABLE=/home/funnywii/Anaconda3/bin/python3.10 \
-D CUDNN_LIBRARY=/usr/lib/x86_64-linux-gnu/libcudnn.so.8.9.2 \
-D CUDNN_INCLUDE_DIR=/usr/include \
-D CUDA_CUDA_LIBRARY=/usr/lib/x86_64-linux-gnu/libcuda.so.535.43.02 \
-D OPENCV_PYTHON3_INSTALL_PATH=/home/funnywii/Anaconda3/lib/python3.10/site-packages \
-D WITH_WEBP=OFF \
-D WITH_OPENCL=OFF \
-D ETHASHLCL=OFF \
-D ENABLE_CXX11=ON \
-D BUILD_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=OFF \
-D HAVE_opencv_python3=ON ..
参考文章
[1] https://blog.csdn.net/woainannanta/article/details/78260419
[2] https://blog.csdn.net/a454193977/article/details/128713534
[3] https://github.com/LinusCDE/mad-jetson-ffmpeg
[4] https://github.com/jocover/jetson-ffmpeg