实验室GPU服务器一般使用者是没有Root权限的,也就是只是普通用户权限。我们实验室服务器安装的Opencv都是最新的OpenCV 3.2版本,而我要跑的程序(GPU提取视频光流特征)是依赖于Cuda版本的OpenCV2.4。因此我需要在我的目录下安装OpenCV2.4 版本。经过查看,服务器已经安装了Cuda 8.0. GPU 为NVIDIA的TiTan.
以下是我的安装过程
1. 首先在终端运行下列命令进行必要的编译环境安装。
$ sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev
2.下载openCV 2.4.9 并且解压
3. 进入解压目录
$ cd opencv 2.4.9
4. 进行外部编译,也就是需要建立 build 文件夹,并进入build 文件夹
$ mkdir build
$ cd build
5. 重点来了,Cmake 目录默认是在 /usr/local,但是非root 用户没有write权限,后面make 的时候会报错,所以我们要改变生成的库文件的路径,我想把opencv 2.4 安装在我的home文件夹下,因此下面cmake安装路径为/home/lixinhui/local/opencv2(个人设置)
$cmake-DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/home/lixinhui/local/opencv2 -D
如果报错:
nvcc fatal : Unsupported gpu architecture 'compute_11' CMake Error at cuda_compile_generated_matrix_operations.cu.o.cmake:206 (message):
Error generating
是因为Titan显卡(包括GTX 900系列)的架构是比较新的Maxwell架构,应该在cmake 参数命令中增加
-D CUDA_GENERATION=Kepler
虽然Kepler架构是Maxwell架构的上一代,但是这样配置也可以成功。
也就是说上面一句话应该改为:
$cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/home/lixinhui/local/opencv2 -D CUDA_GENERATION=Kepler ..
6. $ make -j4
此处会出现各种错误。我遇到的有
错误 1
/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp(51):error:a storageclass isnot allowedin anexplicit specialization
解决方法 :
打开错误的文件:
$ vi /home/lixinhui/opencv-2.4.9/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp
将其中template声明中的所有static全部删除。也就是把(template<> static inline 改为template<> inline ):
错误原因 : OpenCV 2.4版本与Cuda 衔接有bug
错误 2
/home/lixinhui/opencv-2.4.9/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared
typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat
^
/home/lixinhui/opencv-2.4.9/modules/cudalegacy/src/graphcuts.cpp:135:18: error: ‘NppiGraphcutState’ does not name a type
operator NppiGraphcutState*()
^
/home/lixinhui/opencv-2.4.9/modules/cudalegacy/src/graphcuts.cpp:141:9: error: ‘NppiGraphcutState’ does not name a type
NppiGraphcutState* pState;
解决方法:
$vi /home/lixinhui/opencv-2.4.9/modules/cudalegacy/src/graphcuts.cpp
将
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
改为
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
重新make,编译成功【100%】,此时可以在目标路径比如我的是 /home/lixinhui/local/opencv2下看到
这个时候我们就可以用openCV 的头文件和动态库文件了。
当然,如果想把opencv2.4 的路径设置成你的环境变量,需要修改 .bashrc 文件。
我的目的是想把Opencv的动态库链接到我的程序中,下一篇讲解如何通过动态链接的方式,即修改我的程序的CMakeLists.txt的文件,使其不链接到系统默认Opencv3.2 ,而是链接到我home下的Opencv 2.4.
参考博客 :
1. http://www.linuxidc.com/wap.aspx?nid=99753&cid=5&sp=459
2. http://blog.csdn.net/allyli0022/article/details/62859290
3. http://blog.h5min.cn/JK198310/article/details/73718600