本文以编译并安装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.0.zip
$ unzip opencv_contrib-3.3.0.zip

3. 配置

$ cd ~/opencv/opencv-3.3.0
$ 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.0/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.4/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:72:31: error: ‘traits’ has not been declaredCV_Assert(guide.type() == traits::Type<GuideVec>::value);opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp:72:52: error: expected primary-expression before ‘>’ tokenCV_Assert(guide.type() == traits::Type<GuideVec>::value);opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp:72:53: error: ‘::value’ has not been declaredCV_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 1 exit status
modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:319: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed
make[2]: *** [lib/libopencv_sfm.so.3.3.0] Error 1
CMakeFiles/Makefile2:13259: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed
make[1]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error 2
Makefile:147: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:

重新配置并安装 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。

问题四:

[ 98%] 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 1 exit status
modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:318: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed
make[2]: *** [lib/libopencv_sfm.so.3.3.0] Error 1
CMakeFiles/Makefile2:13259: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed
make[1]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error 2
Makefile:147: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:

同上。

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

转载于:https://www.cnblogs.com/klchang/p/7510526.html

如何编译 opencv3 和 opencv_contrib(Linux)相关推荐

  1. opencv3.2+opencv_contrib+cmake

    转自原文 opencv3.2+opencv_contrib+cmake 心得体会 初学OpenCV发现opencv3.2(下载链接在附录)是没有xfeatures2d等模块的.第三方库opencv_c ...

  2. ros加载编译opencv-3.4.9,编译安装opencv-3.4.9

                                                            ros加载编译opencv-3.4.9 ros中配置opencv 1.加载自己的open ...

  3. 使用最新版本Android NDK-r21 编译 opencv-3.3.1 + opencv_contrib-3.3.1

    由于新版本的NDK跟旧版本NDK编译的opencv存在兼容问题,所以需要使用最新的NDK重新编译opencv,方法步骤如下: Android NDK-r21 编译 opencv-3.3.1 + ope ...

  4. ubuntu16.04 编译 opencv3.1.0 (Anaconda)

    在Anaconda环境中编译opencv3并能让python2.7调用. 这一年倾向于写有道云笔记,懒得写博客. 写得有点超级无敌乱,将就看看吧.我只是想用opencv从电影中提取人脸图片而已= = ...

  5. windows下编译opencv3.4.6和opencv-contrib

    在Windows服务器上编译opencv3.4.6 参考链接 How to build OpenCV with Cuda and cuDNN support in Windows - 2023 - M ...

  6. Open vSwitch(OVS)源码编译Ubuntu16.04,Linux内核版本4.15

    Open vSwitch(OVS)源码编译Ubuntu16.04,Linux内核版本4.15 关于Open vSwitch(OVS)版本与Linux内核的关系,参考这篇文章:Open vSwitch( ...

  7. ubuntu16.04 编译opencv4和opencv_contrib

    ubuntu16.04 编译opencv4和opencv_contrib 下载源码 安装最新的cmake 使用cmake-gui配置cmake文件 make && install 添加 ...

  8. linux如何编译wine,利用winelib编译一个可在linux下运行的程序

    利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...

  9. linux内核编译最详细,Linux内核编译详细教程,linux内核编译

    Linux内核编译详细教程,linux内核编译 尝试编译下Linux-kernel 4.14.14,使用Ubuntu 16.04 64位 系统. kernel-4.14.14 内核文件约96MB,解压 ...

最新文章

  1. 《网络安全协议》课程实验大纲
  2. JavaScript 的简单学习2
  3. MaterialEditText 控件学习
  4. wps文字退格会删掉文字_WPS第二行文字前面有大量空白,按退格不会动,只是把上一行末尾的字去掉。...
  5. 图分区技术基本概念【1】
  6. 跨平台视频通信项目-OpenTok
  7. jqury-zoom的一个例子
  8. python读取redis存储数据的存储时间_Python读写Redis数据库操作示例
  9. java 抽象工厂工厂_java之抽象工厂
  10. 使用上下文属性将C ++对象嵌入QML
  11. json字符串转java对象数组
  12. .NET Core 中使用 Humanizer 显示友好时间格式
  13. 北大青鸟广州天河中心C#学习笔记一--C#中的参数传递
  14. labeme批量转换json文件_Python实现markdown文件批量转换为word
  15. MATLAB基础教程-台大郭彦甫-学习笔记
  16. 17年前那场疫情:马云隔离在家,刘强东关了12家店,俞敏洪欠债700万......
  17. WPF实例系列一:登录、注册界面设计
  18. Qt --- 基础知识
  19. QML 编译release 报错: qmlcache_loader.cpp:-1: error: undefined reference to `__imp__ZN11QQmlPrivate13qml
  20. Windows注册表详解

热门文章

  1. Java版 数字金额大写转换
  2. Vim用原生雅黑Consolas混合字体
  3. 100%防御ARP***
  4. 通过Ant控制Hibernate操作数据库
  5. 《软件设计精要与模式》之Factory Method模式
  6. nacos配置中心使用_SpringBoot开发案例Nacos配置管理中心
  7. JQuery Mobile中特有事件和方法
  8. 策略模式实现支持多种类数据库的DBHelp
  9. 20.Azure备份Azure上的虚拟机(中)
  10. 深入理解Tomcat系列之五:Context容器和Wrapper容器