本文以编译并安装OpenCV 3.3.0 为例,安装系统为 Linux x64 (Fedora 21),具体步骤如下:

1. 下载 Source code zip 压缩包

从下面网址,选择 opencv 3.3.0 Source code 下载
https://github.com/opencv/opencv/releases

从下面网址,选择下载与 opencv 3.3.0 对应的 opencv_contrib 3.3.0
https://github.com/opencv/opencv_contrib/releases

注意:opencv和opencv_contrib 版本必须保持一致,否则可能会出现编译错误。

2. 准备安装目录,并解压源码

2.1 准备安装目录
本人准备将 opencv 安装到 ~/libs/opencv-trunk/release/installed 目录,没有安装到默认目录,其好处,一是节省根目录空间(前提是 /home 和 / 不是一个分区);二是可以安装多个版本的 opencv,详见参考资料 How to Have Multiple Versions of OpenCV Side by Side

$ mkdir -p ~/libs/opencv-trunk/release/installed

2.2 解压 opencv zip 压缩包
将下载的 zip 压缩包复制到 ~/opencv 目录,并解压。

$ cd ~/opencv
$ unzip opencv-3.3..zip
$ unzip opencv_contrib-3.3..zip

3. 配置

$ cd ~/opencv/opencv-3.3.
$ mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/home/klchang/libs/opencv-trunk/release/installed -DCMAKE_BUILD_TYPE="Release" -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3./modules ..

注意,

1)这里的配置是将 opencv 3.3.0 和 opencv_contrib 3.3.0 一起编译,如果只需编译 opencv 3.3.0,把 "-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.0/modules" 去掉即可;
2)如果需要更改安装位置或按默认位置安装,则 需要更改 "-DCMAKE_INSTALL_PREFIX="后的目录,或将此项配置删除。

4. 编译并安装

$ make -j4
$ make install

注:在重新编译时,无需执行 make clean,因为这样会节省再次编译的时间,编译系统会自动利用已经编译好的中间文件,而对于编译通过的部分,无需再重新编译。

5. 问题与解决方法

问题一:

fatal error: unsupported/Eigen/MatrixFunctions: No such file or directory

解决方法:

复制 eigen-3.3.4/unsupported 目录到 /usr/local/include,然后删除 unsupported/ 目录下,除 Eigen/ 目录外,所有的目录和文件。

$ sudo cp -r eigen-3.3./unsupported /usr/local/include
$ cd /usr/local/include/unsupported
$ shopt -s extglob
$ sudo rm -rf !(Eigen)

然后,重新编译 opencv 。

问题二:

opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp::: error: ‘traits’ has not been declared
CV_Assert(guide.type() == traits::Type<GuideVec>::value); opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp::: error: expected primary-expression before ‘>’ token
CV_Assert(guide.type() == traits::Type<GuideVec>::value); opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp::: error: ‘::value’ has not been declared
CV_Assert(guide.type() == traits::Type<GuideVec>::value);

解决方法:

这是由于编译的 opencv 版本与 opencv_contrib 版本不一致造成的,下载相同版本的 opencv 和 opencv_contrib,然后重新编译。

问题三:

/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `__pthread_key_create@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a: error adding symbols: Bad value
collect2: error: ld returned exit status
modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed
make[]: *** [lib/libopencv_sfm.so.3.3.] Error
CMakeFiles/Makefile2:: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed
make[]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error
Makefile:: recipe for target 'all' failed
make: *** [all] Error

解决方法:

重新配置并安装 gflags library 。将 gflags 配置为 同时编译静态库和动态库,因为 opencv_contrib 的源文件编译过程中,同时使用其静态库和动态库。

$ cd gflags-master
$ mkdir build && cd build
$ cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON ..
$ make
$ sudo make install

然后,重新编译 opencv。

问题四:

[ %] Building CXX object modules/sfm/CMakeFiles/opencv_sfm.dir/src/simple_pipeline.cpp.o
Linking CXX shared library ../../lib/libopencv_sfm.so
/usr/bin/ld: cannot find -lgflags_static
collect2: error: ld returned exit status
modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed
make[]: *** [lib/libopencv_sfm.so.3.3.] Error
CMakeFiles/Makefile2:: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed
make[]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error
Makefile:: recipe for target 'all' failed
make: *** [all] Error

解决方法:

同上。

6. 参考资料

[1] Installation in Linux
http://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html
[2] How to Have Multiple Versions of OpenCV Side by Side
http://code.litomisky.com/2014/03/09/how-to-have-multiple-versions-of-the-same-library-side-by-side/

7. 附录:本人使用源码包版本及百度网盘下载

OpenCV 3.3.0 - https://pan.baidu.com/s/1bp2cq67

opencv_contrib 3.3.0 - https://pan.baidu.com/s/1nuKy4bB

eigen 3.3.4 - https://pan.baidu.com/s/1kUXtMEr

gflags 2.2.1 - https://pan.baidu.com/s/1miC9jTI

glog 0.3.3 - https://pan.baidu.com/s/1gfktlPD

ceres-solver 1.13.0 - https://pan.baidu.com/s/1c1Z9WPU

最新文章

  1. Android中访问sdcard路径的几种方式
  2. 第十三章:降维:主成分分析PCA
  3. 破解网络投票IP限制、验证码限制、COokie限制、Seesion限制的方法!(转)
  4. HTTP 和 SOAP 标头 来传递用户名密码 验证webservice用户认证
  5. Cognos报表调度与作业管理
  6. 201521123087《Java程序设计》第14周学习总结
  7. HashMap面试题:90%的人回答不上来
  8. 简单的OC程序
  9. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)
  10. 【双目备课】OpenCV例程_stereo_calib.cpp解析
  11. 3分钟学会做智能插座(DIY)
  12. vagrant 入门
  13. numpy.linspace()等差数列函数
  14. 使用Spring配置动态数据源实现读写分离
  15. 资产管理系统 CMDB 讲解
  16. Mysql建表语句
  17. RichTextBox 清空
  18. qt4.8转qt5.4
  19. Stat3—因子分析(Factor Analysis)
  20. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

热门文章

  1. Python——数据交换格式简要
  2. JobScheduler布置后台任务以及实现进程保活?
  3. vue,新手上路,基础,常见问题
  4. HttpClient登陆后获取并携带cookies发起请求
  5. 解决执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error
  6. typescript -- ts
  7. PHP面向对象的基本思路
  8. Python基础(1) - 初识Python
  9. 架构实战项目心得(六):后台服务nosql数据库mongodb
  10. [转]JavaScript和html5 canvas生成圆形印章