引言
本篇主要想总结一下Ubuntu下opencv对于CPU的编译全过程,以及遇到的一些坑。
依赖项安装
首先我们需要CMake来配置安装,GCC进行编译,Python-devel和Numpy来构建Python绑定等。
sudo apt-get install cmake
sudo apt-get install gcc g++
一般云服务器是没有cmake的,而本地服务器的cmake也可能会版本比较低,如果需要编译opencv4以上的版本,需要将cmake卸载,通过GitHub中的最新版源码安装,因为当前没有官方源更新到相应的版本。
GTK支持(图形界面库)
# 安装gtk2支持
sudo apt-get install libgtk2.0-dev
# 安装gtk3支持
sudo apt-get install libgtk-3-dev
可选图片支持库
sudo apt-get install libpng-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libtiff-dev
sudo apt-get install libwebp-d
安装python2、python3支持模块
一般不建议安装2的版本,在centos中因为yum连接为python2.7,这里会有很神奇的事情发生,有一次再重新编译过程中,我没有锁定python3的版本,发现cmake到make都没问题,make install的时候opencv的动态库自动匹配到了python2.7而给我安装了opencv2.4.5的动态库。。。但我的包是3.4.6,所以如果不是对2有要求,建议在配置锁定。
# 安装python2支持
# sudo apt-get install python-dev python-numpy
# 安装python3支持
sudo apt-get install python3-dev python3-numpy
GUI功能的GTK支持,相机支持(v4l),媒体支持(ffmpeg,gstreamer)等。
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
当然,如果需要配合ffmpeg使用的话,这些包是不够的,后面会提到还有哪些包缺失已经出问题的原因,这里可以引用一个超级大法,把能装的都写上跑一遍就行,当然这是没有办法的时候的办法了。。。
sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264v4l-utils unzip
ffmpeg安装
我之前有总结过关于ffmpeg的编译方式,这里就不过多引用了,根据需求进行编译安装:
ffmpeg源码带libx264安装并用ffplay推流测试
这里主要介绍一些依赖包的地址:
libogg
Oog 数据流库, 是libtheora 和 libvorbis 的依赖
libogg-1.3.2.tar.gz
Url:http://www.xiph.org/downloads/
lame
lame-3.99.5.tar.gz
Url:http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309
NASM
一个汇编编译器
nasm-2.13.01.tar.bz2
Url: http://www.nasm.us/pub/nasm/releasebuilds/2.13.01/nasm-2.13.01.tar.bz2
Yasm
另一个汇编编译器
yasm-1.3.0.tar.gz
http://www.tortall.net/projects/yasm/releases/
libvorbis
libvorbis-1.3.3.tar.gz
Url:http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
(libvorbis依赖于libogg, 所以libogg必须先于libvorbis安装)
xvid
xvidcore-1.3.2.tar.gz
Url:http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
x264
latest_x264.tar.bz2 (其中包含的目录是 x264-snapshot-20131023-2245) ,H.264 的视频编码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-gpl --enable-libx264
Url:http://www.videolan.org/developers/x264.html
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
amr-nb
amrnb-10.0.0.0.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/ ( 从此处下载最新版本 )
amr-wb
amrwb-7.0.0.1.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/ ( 从此处下载最新版本 )
faad2
faad2-2.7.tar.gz
http://www.audiocoding.com/downloads.html
libfdk_aac
AAC 音频解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libfdk_aac, 如果添加了 --enable-gpl参数, 还需要同时使用 --enable-nonfree 参数
https://github.com/mstorsjo/fdk-aac
libvpx
VP8/VP9 视频编解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libvpx
https://chromium.googlesource.com/webm/libvpx.git
以上包的安装方式都是找到configure所在目录,然后编译安装:
./configure
make
make install
然后网上还有一种https的安装方式,我尝试过但请求被拦截了下来,因为ssl,所以还是用上面的安装包,需要什么装什么。
opencv安装
当所有依赖和ffmpeg都安装好并没有问题的情况下,可以进行OpenCV的编译,将opencv3.4.7解压后创建build文件夹并进入:
# 新建build文件夹,存放构建文件
$ mkdir build
$ cd build
执行cmake,构建CMakeLists.txt自动化创建makefile,cmake需要之前可以指定一些构建参数,用来确定安装位置:
# 傻瓜式cmake
cmake ../
# 带参数cmake 默认位置安装
cmake ../ -DWITH_CUDA=OFF -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF
# 带参数cmake 自定义位置安装
cmake ../ -DWITH_CUDA=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/opencv-3.4.7 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF
然后可以看到cmake进行编译与满屏的日志,这里还会出现一个问题,可能ippicv_2019_lnx_intel64_general_20180723.tgz没有下载成功,因为它会向外网发送一个HTTP请求,如果下载失败,我将资源上传到了百度网盘里:链接:https://pan.baidu.com/s/1clRhwdCph4KtJcyTGg7sqA
提取码:htpi
-- IPPICV: Download: ippicv_2019_lnx_intel64_general_20180723.tgz
--
=======================================================================
Couldn't download files from the Internet.
Please check the Internet access on this host.
=======================================================================
CMake Warning at cmake/OpenCVDownload.cmake:193 (message):
IPPICV: Download failed: 6;"Couldn't resolve host name"
For details please refer to the download log file:
/home/runone/program/opencv-3.4.7/build/CMakeDownloadLog.txt
如上,是失败日志,我编译了很多次都有概率出现安装不下来的时候,然后每次手动加载包的时候又忘记放哪了,索性上传网盘,如果链接失效,可以私信或者评论区留言。
下载好后,将文件放在opencv-3.4.7/3rdparty/ippicv下,然后更改ippicv下的ippicv.cmake 文件,vim进去后定位到47行,将路径改成安装包的绝对路径的上一级,然后再次尝试cmake:
出现如下日志,说明ippicv_2019_lnx_intel64_general_20180723.tgz本地包加载成功:
-- IPPICV: Download: ippicv_2019_lnx_intel64_general_20180723.tgz
-- found Intel IPP (ICV version): 2019.0.0 [2019.0.0 Gold]
-- at: /home/program/opencv-3.4.7/build/3rdparty/ippicv/ippicv_lnx/icv
-- found Intel IPP Integration Wrappers sources: 2019.0.0
-- at: /home/program/opencv-3.4.7/build/3rdparty/ippicv/ippicv_lnx/iw
第二个问题 是关于ffmpeg的问题,如果依赖不是按照上述中安装的那样,会出现opencv检索ffmpeg全no的情况:
FFMPEG: NO
avcodec: NO
avformat: NO
avutil: NO
swscale: NO
avresample: NO
这个问题坑了我两个多小时,网上面的解答都是说我没有加检索路径,需要添加ffmpeg的项,然后不外乎就是下面这几句:
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig:/usr/local/lib
sudo cp /usr/local/ffmpeg/lib/pkgconfig/* /usr/share/pkgconfig
后来重新卸载了几遍ffmpeg后,在编译最后看到了问题所在。。这也说明,即使编译输出很多,但该检索还是需要看一遍的:
Can't find ffmpeg - 'pkg-config' utility is missing
那么这句话说明,少了pkg-config的依赖,我一直以为预装好了,但没有,so:
apt-get install pkg-config
pkg-config的作用是:
- 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
- 获得编译预处理参数,如宏定义,头文件的位置。
- 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
- 自动加入所依赖的其它库的设置。
另外还有一些其它问题,本篇CPU的话就不再赘述了,等之后写关于GPU的编译笔记在贴出遇到的错误,只能说遇到了太多太多问题。。。当我们CMake好后,需要看cmake输出是否对 Link libraries 进行了两个版本的python的链接,如果有,那么需要注意,最好是在环境变量中先暂时锁定python3,因为上述没有安装python2的依赖,直接make可能会出问题。
如果检查cmake输出无误,那么就可以进行make和make install,在CPU下,make一般不会出现问题,只有GPU才会报很多异常错误,这里make按照自己服务器的核数进行多核编译,因为单核下,实在是太慢,所以我的编译命令为:
make -j8
make install
不飘红或者make error即为成功,然后将其导入环境配置项中:
# 将opencv添加到系统环境变量中,使得其他程序能够找到opencv环境
vim /etc/ld.so.conf.d/opencv.conf 追加 /usr/local/opencv3/lib64/
sudo ldconfig -v
sudo cp /usr/local/opencv3/lib64/pkgconfig/opencv.pc /usr/share/pkgconfig/
#测试opencv是否安装成功
pkg-config --modversion opencv
# 显示如下
3.4.7
到此,opencv就算编译成功,如果需要调用,找到编译成功的python路径下产生了cv2.cpython-36m-x86_64-linux-gnu.so
,将其移动到所需项目下即可启动。