较新的安装教程:树莓派4B安装OpenCV教程_luoi_han的博客-CSDN博客_树莓派4b安装opencv
这几天安装opencv,其他的问题好说,但是遇到了这个问题:
/home/pi/Downloads/opencv/opencv-master/modules/videoio/src/cap_ffmpeg_impl.hpp:2347:42: error: invalid conversion from ‘const AVCodec*’ to ‘AVCodec*’ [-fpermissive]
AVCodec* codec = avcodec_find_encoder(c->codec_id);
因为在此前,我使用ffmpeg开发了音频采集软件,安装了最新的ffmpeg库。ffmpeg库在3.3版本及以后,有了很大改动,废弃了很多函数,导致程序无法兼容,比如,废弃了 av_register_all(), av_stream 类也没有了codec成员等。
最初,我还以为可以使用安装依赖库的方法降低库版本,比如:
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
但是尝试了很多次都失败了。无奈,只能狠心放大招了,重装ffmpeg
sudo apt-get purge ffmpeg
Index of /releases
选择3.3版本以下的源码,下载,然后解压。直接双击下载好的.tar.gz,然后指定一个目录即可,我是放在了Downloads下的ffmpeg文件夹下。
cd 到解压后的目录下,先配置编译选项
./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
然后编译
sudo make -j4
然后安装
sudo make install
这个时候你会发现,/usr/local/lib文件夹下高版本的库 xxxx.a的创建时间什么的都已经是最新的,说明已经安装成功!
如果没有添加环境变量路径,可以:
sudo nano /etc/ld.so.conf
然后增加一行:
/usr/local/lib
ctrl+x -> y ->enter 保存退出,然后刷新环境变量:
sudo ldconfig
这样动态库就生效了
接下来需要重新配置和编译:
删除build下的所有东西:
sudo rm -r *
然后配置make:
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv/opencv_contrib-master/modules \ -D ENABLE_PRECOMPILED_HEADERS=OFF \ -D BUILD_EXAMPLES=ON ..
然后编译还是会出问题,提示找不到对应的库,但是明明已经安装了libav* 的那些库:
[ 76%] Building CXX object modules/videoio/CMakeFiles/opencv_test_videoio.dir/test/test_video_io.cpp.o
[ 76%] Linking CXX executable ../../bin/opencv_test_videoio
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_init'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_close'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `avcodec_decode_video2'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `avcodec_get_context_defaults3'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_filter'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_register_all'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_lockmgr_register'
2022.04.20 最终解决方案:
SD卡格掉,在不安装ffmpeg的情况下,参考例程安装opencv。快速开卡安装请参考:
空卡安装设置树莓派4B_maum61的专栏-CSDN博客
2022.07.22 新的解决方案
由于库版本问题,更新了opencv到4.5.3版本,这个版本依赖的ffmpeg是 4.1版本的,下载了4.1版本的,具体链接参考下面这个网址:
FFMPEG 最全版本介绍及下载_seniorwizard的博客-CSDN博客_ffmpeg 所有版本
为了不让QT报错,之前把最新版本的FFMPEG下载了,也就是xxx.so.59等,否则QT会报ffmpeg多个版本库可能冲突的提示。现在还是想用命令行的ffmpeg,那就安装4.1的ffmpeg,命令行现在没问题了,QT中引用ffmpeg库和opencv的话,建议还是都使用opencv安装的ffmpeg库,避免冲突。