Linux 系统中编译OpenCV-2.4.9

博主在Ubuntu 15.10 下安装Caffe时需要编译OpenCV 2.4.9,前期已经安装好CUDA 7.5和 cuDNN v4,显卡是NVIDIA TITAN X。Linux下OPenCV的编译安装网上有很多教程,本文主要是总结实际安装过程中出现的问题和解决方法。

一. 安装

1 安装cmake及一些依赖库

$ sudo apt-get install cmake
$ sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

2 安装opencv

       从官网下载opencv并解压,cd命令进入opencv的目录:

$ unzip OpenCV-2.4.9.zip
$ cd opencv-2.4.9
$ mkdir build
$ cd build
$ cmake ..
$ sudo make -j4
$ sudo make install

二. 配置环境

    将opencv的库加入到路径,从而让系统可以找到:

$ sudo gedit /etc/ld.so.conf.d/opencv.conf

    末尾加入/usr/local/lib,保存退出。

$ sudo ldconfig #使配置生效

    打开/etc/bash.bashrc;

$ sudo gedit /etc/bash.bashrc 

    在文件末尾加入:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

    保存退出

$ sudo source /etc/bash.bashrc  #使配置生效
$ sudo updatedb #更新database

三. 测试使用

    打开opencv2.4.9目录下的opencv-2.4.9/samples/c,运行build_all.sh脚本

# build
./build_all.sh

    使用下面的一个sample进行测试

./pyramid_segmentation

四. 使用脚本安装

    Github上有人已经写好了完整的安装脚本:https://github.com/jayrambhia/Install-OpenCV
下载该脚本,进入Ubuntu/2.4 目录, 给所有shell脚本加上可执行权限
chmod +x *.sh
然后安装最新版本 (当前为2.4.9)
sudo ./opencv2_4_9.sh
【参考1】http://www.cnblogs.com/platero/p/3993877.html

五. 编译错误及解决方案

1. Unsupported gpu architecture ‘compute_11’

问题描述:
    使用cmake生成Makefile文件以及make的过程中,报如下错误:

nvcc fatal   : Unsupported gpu architecture 'compute_11'
CMake Error at cuda_compile_generated_matrix_operations.cu.o.cmake:206 (message):
  Error generating
/home/smie/Documents/opencv2.4.11/build/modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_gene

rated_matrix_operations.cu.o

make[2]: ***
[modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_generated_matrix_operations.cu.o] Error 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.…

    这是因为Titan显卡(包括GTX 900系列)的架构是比较新的Maxwell架构,应该在cmake 参数命令中增加 -D CUDA_GENERATION=Kepler
    虽然Kepler架构是Maxwell架构的上一代,但是这样配置也可以成功。
    完整的cmake命令如下

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

【参考2】http://blog.csdn.net/sysuwuhongpeng/article/details/45485719

2. libopencv_highgui.so.2.4.5: undefined reference to `png_set_longjmp_fn’

问题描述:
    make过程中链接错误:

Linking CXX executable ../../bin/opencv_perf_core
../../lib/libopencv_highgui.so.2.4.5: undefined reference to `png_set_longjmp_fn'
collect2: ld 返回 1
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误

分析:
    经查,与编译libopencv_highgui.so.2.4.5时参数有关,修改编译pencv_perf_core的文件
/home/wjq/Documents/opencv/opencv-2.4.9/build/modules/imgproc/CmakeFiles/opencv_perf_imgproc.dir/link.txt
都增加或改为:-lpng /usr/local/lib/libpng16.so
该错误解决。
原因:
系统中libpng.so库有不同版本,指定使用libpng16.so
【参考3】http://gaodr.blog.163.com/blog/static/10461500820134824949883/

3. OpenCV代码bug: NCVPixelOperations.hpp

    在编译过程中,可能会中途报错:

opencv-2.4.9/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp(51): error: a storage class is not allowed in an explicit specialization

    需要使用下载NCVPixelOperations.hpp替换掉opencv2.4.9内的文件, 重新build。
因为某些原因,上述链接已经失效,我将会上传.hpp文件:
NCVPixelOperations.hpp 修改bug
http://download.csdn.net/detail/solomon1558/9581114

【参考4】http://code.opencv.org/issues/3814

4. /usr/bin/ld: cannot find -lxxx 问题

问题描述:
    build过程中找不到动态连接库/usr/bin/ld: cannot find -lcufft在测试过程中./build_all.sh报如下错误:

collect2: error: ld returned 1 exit status
compiling tree_engine.cpp
/usr/bin/ld: cannot find -lcufft
/usr/bin/ld: cannot find -lnpps
/usr/bin/ld: cannot find -lnppi
/usr/bin/ld: cannot find -lnppc
/usr/bin/ld: cannot find -lcudart
collect2: error: ld returned 1 exit status

问题分析:
    linux下编译应用程序常常会出现如下错误:

/usr/bin/ld: cannot find -lxxx

    一般出现这种错误有以下几种原因:

1.系统缺乏对应的库文件;
2.版本不对应;
3.库文件的链接错误;
4.库文件路径设置问题;

    对应第一第二种情况,可以通过下载安装lib来解决,ubuntu大多数可以直接通过apt-get来安装:

apt-get install libxxx-dev

    一般遇到这种问题笔者第一时间也是会去检查系统是否已安装该lib或者是否已选择正确版本(只是习惯问题),如果还是不能解决问题,那么,引起错误的原因不是链接错误就是库文件路径问题了。
    通过find或者locate指令定位到链接文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用 ln -sf /libxxx.so.x /libxxx.so 指令修改它。

root@wjq-NUDT:/home/wjq/Documents/opencv/opencv-2.4.9/samples/c# find / -name libcufft.so
/usr/lib/libcufft.so
/usr/local/cuda-7.5/lib64/libcufft.so
/usr/local/cuda-7.5/lib64/stubs/libcufft.so

    如果是库文件路径引发的问题,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件

root@wjq-NUDT:~# gedit /etc/ld.so.conf.d/opencv.conf

    然后ldconfig命令更新报错共享库路径的ld.so.cache

root@wjq-NUDT:~# ldconfig

    然而笔者在opencv.conf配置文件中添加cuda的链接库路径后,仍然无法正确编译。后来直接将cuda/lib64中相应的动态看cp到/usr/lib中,在编译的时候系统自动搜索该路径下的动态链接库。注意cp -a属性表示”保留原文件属性的前提下复制文件”,包括“动态链接库之间的软连接关系”

# cp -a libcufft.so* /usr/lib/
# cp -a libnpps.so* /usr/lib/
# cp -a libnppi.so* /usr/lib/
# cp -a libnppc.so* /usr/lib/

    至此,在Linux 下编译OpenCV成功。

./pyramid_segmentation

Linux 系统中编译OpenCV-2.4.9_第1张图片

Reference:

[1] 普兒的技术传送门.Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
http://www.cnblogs.com/platero/p/3993877.html
[2] sysuwuhongpeng的博客.Unsupported gpu architecture ‘compute_11’解决方法
http://blog.csdn.net/sysuwuhongpeng/article/details/45485719
[3] gaodr的博客.opencv编译问题及解决方法
http://gaodr.blog.163.com/blog/static/10461500820134824949883/
[4]OpenCV DevZone. OpenCV isn’t compatible with CUDA 6.5 (Bug #3814)
http://code.opencv.org/issues/3814

你可能感兴趣的:(计算机视觉CV,OpenCV,Linux)