在linux下使用opencv处理视频与摄像头采集是经常会遇到无法打开streams的问题,下面介绍如何配置ffmpeg和使用opencv解决这个问题。
首先下载ffmpeg源码包,一定要是源码包,ctrl + alt +t打开终端(文字是说明):
cd ffmpeg/ 设置工作目录
./configure --disable-yasm --enbale-shared --prefix=/usr/local/ffmpeg 生成可连接库,--prefix设置安装路径
make
make install 开始安装
vim /etc/profile 打开环境变量文档
在文尾输入:
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$FFMPEG_HOME/bin:$PATH
退出编辑,回到终端
source /etc/profile
ffmpeg -version 如果显示版本信息,就证明ffmpeg已经成功安装了
vim /etc/profile 添加动态库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
到这里完成安装ffmpeg了,下面开始安装pkg-config
直接使用从linux源安装即可,执行
apt-get install pkgconfig 等待安装结束
vim /etc/profile 打开环境变量文档,并在文末输入
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig:/usr/loal/lib
安装配置完成。这一步基本不会出问题。
安装cmake,还是使用linux源安装即可
apt-get install cmake 这里我选择安装的是精简版的,不带图形界面的
安装opencv,网上下载源码安装包,其实这里可以直接用linux源安装
cd opencv/ 进入opencv目录
mkdir release 新建文件夹
cmake -D CMAKE_BUILD_TYPE= RELEASE -D CMAKE_INSTALL_PATH=/usr/local .. 使用Cmake进行编译别少了两点
观察终端输出,到后头会输出ffmpeg yes等字眼,显示已经支持ffmpeg了
这里可以编译你的ffmpeg和opencv工程了。
首先检测你的环境是否配置成功。
pkg-config ffmpeg --libs --cflags查看ffmpeg链接库是否配置好了(如果没配置好也别着急,继续往下看)
pkg-config opencv --libs --cflags查看opencv链接库和头文件配置
如果没有打印程序的链接库路径,说明链接库没有完整配置好
这个时候首进入ffmpeg文件目录(不是源码目录,是软件安装目录/usr/local/ffmpeg/)/lib的目录的所有文件复制到/usr/local/lib目录下;然后打开ffmpeg/lib/的里有个pkgconfig,把里头的文件全部复制到/usr/local/lib/pkgconfig里头。
将工作目录设置到
cd /usr/local/lib/pkgconfig
vim ffmpeg.pc
编辑ffmpeg.pc
输入
prefix=/usr/local/ffmpeg
exec_prefix=${prefix}
libdir=/usr/local/ffmpeg/lib
includedir=/usr/local/ffmpeg/include
Name: ffmpeg
Description: FFmpeg codec library
Version: 58.17.100
Requires:
Requires.private: libswresample >= 3.0.101, libavutil >= 56.13.100
Conflicts:
Libs: -L${libdir} -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lswresample -lswscale
Libs.private: -L/usr/lib/arm-linux-gnueabinhf -lm -lxcb -lxcb-shm -lxcb -lxcb-shape -lxcb -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb
Cflags: -I${includedir}
保存退出即可。
vim opencv.pc
编辑opencv.pc
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -L/usr/lib/arm-linux-gnueabihf -lpng -lz -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
保存退出
现在基本完成了配置了
开始交叉编译你的工程
g++ `pkg-config opencv ffmpeg --cflags` 你的文件.cpp -o run `pkg-config opencv ffmpeg --libs`
也可以手动制定你的链接库和头文件路径
g++ -o run.exe 你的文件.cpp -I/usr/local/ffmpeg/include -I/usr/local/include -I/home/root/cv/ffmpegFrameToOpencv -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavcodec -lavutil -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs
-I表示头文件路径,-L表示链接库路径,-l表示要链接的库。
这里已经完成工作了
./run 就可以跑你的工程了
ps:其实也可以在/etc/ld.so.conf文件中添加库路径/usr/local/lib,然后在终端ldconfig。第一次写博客,可能有点乱,希望能帮助有需要的朋友