本文以编译并安装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

如何编译 opencv3 和 opencv_contrib(Linux)的更多相关文章

  1. 如何为Android平台编译 opencv3 和 opencv_contrib (Linux)

    编译出来的opencv库有问题,正在调试中 ...... 本文以编译opencv 3.3.0 和 opencv_contrib 3.3.0为例,系统为 Linux x64 (Fedora 21),具体 ...

  2. Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]

    更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...

  3. 树莓派中编译OpenCV3.4.1和OpenCvSharp

    一.简介 本文重点描述在树莓派中编译OpenCV3.4.1和OpenCvSharp,大家都知道OpenCVSharp是使用C#调用OpenCV最简洁的一个库.但是在Linux上或者树莓派上运行时,需要 ...

  4. win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置

    简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...

  5. 树莓派中编译Opencv3.4.1和OpenCVSharp库

    一.简介 本文主要讲在树莓派中编译Opencv3.4.1和OpenCVSharp库,方便C#开发人员可以通过Mono或者Netcore运行C#通过OpenCVSharp写的OpenCV库. 二.过程 ...

  6. opencv3.2+opencv_contrib+cmake

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

  7. <实训|第十三天>linux中ACL权限控制以及磁盘配额,附编译属于自己的linux内核

    [root@localhost~]#序言 首先讲讲昨天关于缩容失败,开不机的解决方法:ACL权限也算是一个很重要的知识点,不难,但是很实用:磁盘配额一般不需要自己弄,但是要懂得原理.剩下的就是编译属于 ...

  8. Centos7编译opencv3.4.1

    Centos7编译opencv3.4.1 参考博客 https://blog.csdn.net/wjbwjbwjbwjb/article/details/79111996 1.配置epel源 yum ...

  9. ubuntu编译opencv3.1遇到的问题

    网上有很多关于编译的具体步骤,我也是按照网上的说明一步步操作的,这里主要想记录的是在安装完之后,import cv2不存在以及其他的libopencv_hdf.so.3.1等找不到的问题,如果将这样的 ...

随机推荐

  1. linux如何安装yum

    yum全称Yellow dog Updater Modified,yum的主要用途是对rpm包进行管理,包括安装.卸载.升级等.linux安装yum也较为简单,具体如下: 工具/原料 1.电脑: 2. ...

  2. openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】

    1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...

  3. Golang框架beego和bee的开发使用

    Golang语言简洁.明细,语法级支持协程.通道.err,非常诱惑人.平时也看了看Golang的语法,正苦于没有需求,我想把beego的源码搬过来看看. 首先,第一步:beego环境的搭建 在我之前看 ...

  4. orcale 之函数

    我们知道存储过程的调用是一条 PL/SQL 语句.那么对于一些表达式我们用什么呢?这里函数的功能就会体现出来了. 函数和过程在创建方式上有很多的类似地方,也是编译后放入内存中以供用户使用,只不过函数调 ...

  5. 使用js命名空间进行模块式开发

    在java中,为了防止命名冲突和模块式开发,会有个一个import 关键字来进行导包. 在js中为了达到同样的效果,我们也通过给其自定义一个“包”的概念. 直接上代码: 首先有个LC.js文件: // ...

  6. D3学习笔记一

    D3学习笔记一 什么是D3? D3(全称Data Driven Documents)是一个用来做Web数据可视化的JavaScript函数库.D3也称之为D3.js. D3是2011年由Mike Bo ...

  7. ubuntu系统之难

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  8. Spark Streaming初探

    1.  介绍 Spark Streaming是Spark生态系统中一个重要的框架,建立在Spark Core之上,与Spark SQL.GraphX.MLib相并列. Spark Streaming是 ...

  9. Getting over the dangers of rm command in Linux---reference

    reference:http://www.coolcoder.in/2014/01/getting-over-dangers-of-rm-command-in.html When we want to ...

  10. sed常用命令

    sed也是一个管道命令. sed [-nefr] [动作] -n 加上-n参数后,只有经过sed特殊处理的那些行才会被列出来 -e 直接在命令行模式进行sed的动作编辑 -i  直接修改读取的文件内容 ...