由于各种地方需要使用opencv,有windows/ubuntu/树莓派等,多次编译opencv源码,每次时间很长,也总结了一些提高编译速度的方法。本文以opencv4和ubuntu16为例。
0. 参考链接
learn opencv: https://www.learnopencv.com
这个网站基本能够找到各种环境下安装opencv,c++/python的教程。更新速度较快,也比较全面。
1. 明确需求
在编译OpenCV前,需要明确一个问题,我需要用opencv的什么功能?
- 如果是基础功能,只需要编译opencv的基础代码即可;
- 如果需要附加功能,好像从opencv3起,新增了opencv_contrib,把一些功能分了出来,如果需要用到里面的,需要编译opencv时加上。
- 如果只需要用到contrib_modules中的部分功能,则把其它的编译关掉。
2. 具体做法
2.1 多线程编译
make -j4
这个是最常用的加速的方法了,即采用4线程编译。这个数也不是越大越好,一般电脑也就是4线程。如果用8或者16,可以发现用top指令看ubuntu内存时虽然有多个线程在编译,但cpu是平分的。所以4比较合理。
2.2 编译contrib时下载文件速度慢
当需要使用contrib时,如果全部contrib的modules都加载,则需要下载许多文件,其中下载速度最慢的是:face_landmark_model.dat,往往下载这个时会超时。解决办法呢:手动下载,并修改contrib中的配置。具体如下。
- 下载face_landmark_model.dat
- 修改以下文件的第19行,
vim opencv_contrib-4.x.x/modules/face/CMakeLists.txt #打开文件
# 修改为:
#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${__commit_hash}/"
"file://where/you/download/face_landmakr_model"
然后再去编译即可。
2.3 关掉测试文件、性能文件的编译
编译过程中,如果直接进行cmake后make,则会编译出一堆测试文件(_test_xxx)和性能测试文件(_perf_xxx),以及一些example例子。这些我觉得没用,可以在编译时关掉。
不建议在cmake时以-D的方式修改参数,毕竟谁能记住这么多呢。建议采用cmake后使用ccmake修改。https://blog.csdn.net/tfb760/article/details/104009802
其中,
BUILD_EXAMPLES
BUILD_TESTS
BUILD_PERF_TESTS
BUILD_opencv_python2
BUILD_opencv_python3
等可以根据名字选择OFF。另外,如果不是需要全部的contrib中的modules,或者某个modules编译总是错误,也可以关掉,例如
BUILD_opencv_sfm # 这个我总是编译不过,就不编了,用到再说。