如何编译 opencv3 和 opencv_contrib(Linux)
本文以编译并安装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)的更多相关文章
- 如何为Android平台编译 opencv3 和 opencv_contrib (Linux)
编译出来的opencv库有问题,正在调试中 ...... 本文以编译opencv 3.3.0 和 opencv_contrib 3.3.0为例,系统为 Linux x64 (Fedora 21),具体 ...
- Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]
更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...
- 树莓派中编译OpenCV3.4.1和OpenCvSharp
一.简介 本文重点描述在树莓派中编译OpenCV3.4.1和OpenCvSharp,大家都知道OpenCVSharp是使用C#调用OpenCV最简洁的一个库.但是在Linux上或者树莓派上运行时,需要 ...
- win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置
简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...
- 树莓派中编译Opencv3.4.1和OpenCVSharp库
一.简介 本文主要讲在树莓派中编译Opencv3.4.1和OpenCVSharp库,方便C#开发人员可以通过Mono或者Netcore运行C#通过OpenCVSharp写的OpenCV库. 二.过程 ...
- opencv3.2+opencv_contrib+cmake
转自原文 opencv3.2+opencv_contrib+cmake 心得体会 初学OpenCV发现opencv3.2(下载链接在附录)是没有xfeatures2d等模块的.第三方库opencv_c ...
- <实训|第十三天>linux中ACL权限控制以及磁盘配额,附编译属于自己的linux内核
[root@localhost~]#序言 首先讲讲昨天关于缩容失败,开不机的解决方法:ACL权限也算是一个很重要的知识点,不难,但是很实用:磁盘配额一般不需要自己弄,但是要懂得原理.剩下的就是编译属于 ...
- Centos7编译opencv3.4.1
Centos7编译opencv3.4.1 参考博客 https://blog.csdn.net/wjbwjbwjbwjb/article/details/79111996 1.配置epel源 yum ...
- ubuntu编译opencv3.1遇到的问题
网上有很多关于编译的具体步骤,我也是按照网上的说明一步步操作的,这里主要想记录的是在安装完之后,import cv2不存在以及其他的libopencv_hdf.so.3.1等找不到的问题,如果将这样的 ...
随机推荐
- oracle使用已有vid快速新建虚拟机
有时候需新建虚拟机,但是每一次新建都花费很多时间,这里在oracle中快速新建虚拟机,只需要复制已有的vdi,然后修改uuid即可 windows下在cmd下输入命令 cd C:\Program ...
- border.css(解决移动端1px问题)
由于某些机型分辨率过高,会导致1px变成2-多px像素的问题,引用bordercss解决 @charset "utf-8"; .border, .border-top, .bord ...
- 在Vue项目中使用html2canvas生成页面截图并上传
使用方法 项目中引入 npm install html2canvas html代码 //html代码 <!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref --> <di ...
- Word常用定义的变量
unit U_WordConst; interface {*******Word窗体状态************} const wdWindowStateNormal = $00000000; ...
- LeetCode 100.相同的树(C++)
给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1 ...
- Robot Framework自动化测试三(selenium API)
Robot Framework Selenium API 说明: 此文档只是将最常用的UI 操作列出.更多方法请查找selenium2Library 关键字库. 一.浏览器驱动 通过不同的浏览器 ...
- HTTPS和SSL详解
这是转载别人的(转:崔永秀) 把这几天学习到的关于ssl和https协议的内容在这里分享一下,适合一些像我一样的网络协议初学者. ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公 ...
- 卸载oracle10g
网上搜集的.暂时先用着完全卸载Oracle方法:软件环境: 1.Windows XP + Oracle 10g 2.Oracle安装路径为:d:\Oracle 1.如果数据库配置了自动存储管理(ASM ...
- Bootstrap使用模态框modal实现表单提交弹出框
Bootstrap 模态框(Modal)插件 模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等.如果 ...
- Python基础(2) - 动态数据类型
Python是一门强类型语言,单定义变量时不需要制定类型. C#这样定义变量: ; VB这样定义变量: Python不需要制定类型,给变量赋什么类型的值,它就是什么类型.(穿神马就是神马?) > ...