ubuntu18.04下opencv用CPU编译全过程

引言

本篇主要想总结一下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利用NVIDIA硬件加速编译

ffmpeg源码带libx264安装并用ffplay推流测试

ffmpeg与srs3编译以及常用命令测试总结

这里主要介绍一些依赖包的地址:

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,将其移动到所需项目下即可启动。

猜你喜欢

转载自blog.csdn.net/submarineas/article/details/108210739