Ubuntu 环境安装 opencv 3.2 步骤和问题记录

摘要:
cmake-DCMAKE_BUILD_TYPE=RELEASE-DBUILD_opencv_gpu=OFF-DWITH_IPP=OFF-DWITH_CUDA=OFF-DWITH_LAPACK=OFF-DCMAKE_INSTALL_PREFIX=~/opencv_src-DBUILD_TIFF=ON..笔者搜集到一些该步骤下可以使用的cmake参数,用户可以根据需要进行使用。在笔者设备上即为~/opencv-3.2.0/CMakeLists.txt文件。在执行cmake命令完成后,会输出对环境和编译模块的检测报告,用户可以从该报告中查看opencv编译环境的相关情况。如笔者的opencv-3.2.0源码包中,其目录3rdparty下即包含有libtiff的源码,选择指定上述选项即使系统通过上述源码进行编译。

记录下笔者源码编译 opencv 的过程( Ubuntu 环境下 ),以及某些报错的解决方法,希望可以帮助有需要的人...

  源码编译 opencv 的主要流程

1.获取 opencv 源代码,用户可以在 opencv-github获取对应版本的 opencv 源代码,并将其解压;

    upzip opencv-3.2.0.zip -d ~          //解压 .zip 文件,默认解压至当前目录,通过 -d 指定解压的目标目录
    tar -xvzf opencv-3.2.0.tar.gz -C ~    //解压 tar.gz 文件,通过 -C 命令解压至目标目录

2.进入解压完成的源码目录,并在其中创建一个新的目录 build,进入该目录;

    cd ~/opencv-3.2.0        //进入解压好的 opencv 源码目录
    mkdir build              //在源码目录中创建新目录 build
    cd build                 //进入 build 目录

3.使用 cmake 命令生成编译整个 opencv 项目的 makefile 等内容,并完成对系统环境的检测,为实际编译过程确定环境。这一步的 cmake 命令中可以加入很多的编译选项,来选择如何对 opencv 源码进行编译,如指定那些模块会被编译,哪些模块不进行编译,以及哪些模块由于依赖关系未被满足(如系统上不存在其所需要的相关库组件等)而无法编译等。是最重要的一步。如果在使用中只需要使用 opencv 的部分模块的话,可以在该阶段进行指定,进而简化编译流程和对系统环境的要求。该步骤所生成的所有信息均存放在之前步骤所新建的 build 目录下,故而可以通过删除 build 目录下的内容来重新执行本步骤。笔者使用的编译指令如下所示。

    cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_gpu=OFF -DWITH_IPP=OFF -DWITH_CUDA=OFF -DWITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=~/opencv_src -DBUILD_TIFF=ON  ..

笔者搜集到一些该步骤下可以使用的 cmake 参数,用户可以根据需要进行使用。  

    -DCMAKE_INSTALL_PREFIX=/path/to/target/   //编译完成后 make install 的安装目录,默认为 /usr/local/
    -DBUILD_opencv_python2=OFF               
    -DBUILD_opencv_python3=OFF                 //和对应的 python 模块相关
    -DOPENCV_GENERATE_PKGCONFIG=ON    -DBUILD_opencv_world=OFF               //将所有的动态库融合为一个 libopencv_world.so 库
    -DOPENCV_EXTRA_MODULES_PATH=/path/to/target/   //如果需要 opencv contrib 的功能,如人脸识别,则通过该参数指定 contrib 目录下 module 文件夹的地址

事实上,这些 cmake 的选项基本可以在 opencv 的源码目录下的 CMakeLists.txt 中找到。在笔者设备上即为 ~/opencv-3.2.0/CMakeLists.txt 文件。

在执行 cmake 命令完成后,会输出对环境和编译模块的检测报告,用户可以从该报告中查看 opencv 编译环境的相关情况。如在 Opencv modules 部分,可以看到后续会对哪些模块进行编译,而哪些模块无法使用。

Ubuntu 环境安装 opencv 3.2 步骤和问题记录第1张

4.在 cmake 命令执行成功后,直接通过 make 命令执行编译过程;  

    make -j4        //执行 make 开始编译流程,其中的 -j4 选项指定运行的任务数,可大大加快编译速度

5.进行安装操作;

    make install          //执行安装操作,会将编译好库文件,可执行文件等复制至 CMAKE_INSTALL_PREFIX 指定的目录

可能的报错及解决方法:

  libzstd.so.1.3.7, needed by /home/xxxxanaconda3/lib/libtiff.so.5

在进行编译的时候,产生报错 "libzstd.so.1.3.7, needed by home/xxxx/anaconda3/lib/libtiff.so.5". 当时的报错的原因在于进行 opencv 编译的时候,使用了存放在 Anaconda 目录 anaconda3/lib/ 中的 libtiff.so 库,原理上其依赖的是同一 anaconda3/lib 目录下的 libzstd.so 库文件,而该目录并不在系统的库文件搜索路径中( /etc/ld.so.conf 指定),使得最终产生找不到 libzstd.so 库的报错。

解决的方案应该是有两种,一种首先查看一下当前设备的 Anaconda 安装目录中的库目录(也就报错信息中的 /home/xxx/ananconda3/lib/ )中是否存在上述两个库,若存在,则将上述两个库文件所在的文件夹加入系统的库文件搜索路径中即可,这里主要通过环境变量 LD_LIBRARY_PATH 指定。这种方式要确保系统上确实存在某个目录中存在上述满足依赖关系的库文件,如本例中 /home/xxx/anaconda3/lib/ 目录中即存在 libtiff.so 库和其所依赖的 libzstd.so 库。

1)首先通过 grep -E 命令搜索多个字符串结果,笔者的设备上的 ~/anaconda3/lib/ 文件夹中即显示有 libtiff.so.5 和 libzstd.so.1.3.7. 首先确定对应的目录下确实包含有上述报无法找到错误的库。

    ls ~/anaconda3/lib/ | grep -E "zstd|tiff"        //查看用户主目录 ~ 下的 anaconda3/lib/ 目录中是否存在名字带 zstd 或 tiff 的库

2) 将上述目录加入系统库文件搜索路径中,通过对环境变量 LD_LIBRARY_PATH 的设置实现

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxxx/anaconda3/lib/        //将上述存在 libzstd.so 库的路径加入库文件搜索路径中

第二种解决方法即 opencv 在进行编译的时候实际可以选择不选用系统上的 libtiff.so 库,而是直接对其所依赖的 tiff 模块进行编译,从而避免产生缺少依赖库的情况。只需在 cmake 阶段加入参数 -D BUILD_TIFF=ON 即可。如笔者的 opencv-3.2.0 源码包中,其目录 3rdparty 下即包含有 libtiff 的源码,选择指定上述选项即使系统通过上述源码进行编译。笔者即通过第二种方法解决。

    -DBUILD_TIFF=ON          //cmake 阶段加入该参数,使得 opencv 自行编译 libtiff.so 等依赖库,而不依赖使用系统上的已有库

参考:

opencv github issue  

complie and link,warning not found libpcre.so.1

  ICV: Local copy of ICV package has invalid MD5 hash

根据网上的资料,上述错误产生的原因是下载 ippicv 错误造成的。如果实际上并不使用 ippicv 功能的话,可以在 cmake 命令执行时加上关闭 IPP 的选项。网上讨论有说上述报错是由于 CMake 在不支持正确的下载协议时下载空文件所造成的。如果必须使用 IPP 相关功能,可以查阅参考文献的相关内容。  
    -DWITH_IPP=OFF          //关闭对 ippicv 模块的使用

参考:

OpenCV build fails because I cannot download ICV on our build farm——opencv

Why cannot I compile the opencv?——stackoverflow

  fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"

上述报错的原因为在编译时的 build 目录下存在一个 opencv_lapack.h 头文件,而其中存在语句 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h“,而实际上系统无法定位得到对应的 lapacke.h 头文件。搜索的解决方案有两种,一种即若用户确定不需要 LAPACK 库的支持,可以在 cmake 阶段使用 -DWITH_LAPACK=OFF 选项关闭 LAPACK 相关的编译流程,从而避免出现问题(需要重新执行 cmake 指令)。

    -DWITH_LAPACK=OFF    //关闭对应的 LAPACK 选项

另一种即需要补齐缺失的头文件,这种方法需要自己具备有安装依赖的权限。具体而言,可以通过 apt install 安装对应的 liblapacke-dev 等包,如下命令所示。

    sudo apt install liblapacke-dev checkinstall      //安装缺失的依赖库

在安装之后,将上述 #include"LAPACKE_H_PATH-NOTFOUND/lapacke.h" 替换为语句 "lapacke.h" 即可完成正确编译。

参考:

fata error: LAPACKE_H_PATH-NOTFOUND when building OpenCV 3.2

OpenCV installation error  

  与 contrib 模块一起编译时出现 file DOWNLOAD HASH mismatch 的问题

这部分的报错貌似和上面的 "Local copy of ICV package has invalid MD5 hash" 的报错问题根源较为一致,都是由于 cmake 下载文件出现问题,根源的解决方法应该时对 cmake 进行重新安装,可以参考上面问题的链接。cmake 的问题导致最终下载的文件大小为 0,从而使得 hash 计算结果出问题。笔者救急使用的方法是将那些出现下载文件问题的文件手动下载至对应的文件目录中,从而使得 cmake 过程可以顺利进行。具体的文件包括,主要从 opencv 论坛的这个问题cmake failing with hash mismatch [closed]找到答案。
boostdesc_lbgm.i 
    boostdesc_bgm.i 
    boostdesc_binboost_064.i 
    boostdesc_bgm_bi.i 
    boostdesc_bgm_hd.i 
    boostdesc_binboost_128.i 
    boostdesc_binboost_256.i 
    vgg_generated_48.i
    vgg_generated_64.i 
    vgg_generated_80.i 
    vgg_generated_120.i 

另外还有可能遇到protobuf-cpp-3.1.0.tar.gz 的下载问题,同样自行下载可以解决,下载地址https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz ,或者直接网络搜索protobuf-cpp-3.1.0.tar.gz download。

参考:
PS
opencv 3.4.0 之后,开始支持用户在编译时指定需要编译那些模块而不对未指定的模块进行编译。具体可以参考 opencv-github-Added BUILD_LIST

免责声明:文章转载自《Ubuntu 环境安装 opencv 3.2 步骤和问题记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis中算法之——Raft算法Jmeter 使用ssh command 链接linux下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

npm run build ERROR in xxx.js from UglifyJs

npm run dev可以正常运行项目,在npm run build的时候,报错。其中就有一行提示:npm run build ERROR in xxx.js from UglifyJs  网上搜了相关的文章,都说是babel配置有问题,在【.babelrc】文件中添加"presets": ["es2015"]就好了。 可是我的配置里已经配置了呀~ 继续查...

读取并监控文件的变化

读取并监控文件的变化 ASP.NET Core 具有很多针对文件读取的应用。比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取。如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目标文件的内容并对请求予以响应。在一个ASP.NET Core MVC应用中,针对View的动态编译会涉及到根据预定义的路径映射关系来读取...

RocketMQ的安装配置:配置jdk环境,配置RocketMQ环境,配置集群环境,配置rocketmq-console

RocketMQ的安装配置 演示虚拟机环境:Centos64-1 (D:linuxMorecentos6_64) root / itcast : 固定IP 192.168.52.128 一,配置JDK环境 1,解压jdk到指定的目录 tar -xvf jdk-8u171-linux-x64.tar.gz -C /usr/local cd /usr/loca...

linux 常用操作以及概念

一、常用操作以及概念 查看LINUX发行版的名称及其版本号的命令: lsb_release -a cat /etc/redhat-release(针对redhat,Fedora) 0.rpm包路径:/mnt/Packages 1. --help 指令的基本用法与选项介绍。 2. man man 是 manual 的缩写,将指令的具体信息显示出来。...

hadoop三个配置文件的参数含义说明

1获取默认配置 配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效。浏览更多的配置,有两个方法: 1.选择相应版本的hadoop,下载解压后,搜索...

搭建自己的React+Typescript环境(二)

前言 搭建自己的React+Typescript环境(一) 上一篇文章介绍了React+Typescript的基础环境搭建,并没有做任何优化配置,以及根据不同的开发环境拆分配置,这篇文章主要就是介绍这些,并且所有配置都是在上篇文章的基础上,如果有什么问题或者不对的地方,希望大佬们能及时指出,最后有项目地址~ 要用到的几个依赖 webpack-merg...