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

  记录下笔者源码编译 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 步骤和问题记录

  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?——*

    

  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 步骤和问题记录

上一篇:常用的进程间通信


下一篇:PLSQL Developer 不能连接 oracle 11g 64位 的解决办法