Ubuntu 非root 权限(普通用户)安装OpenCV 2.4.9

来源:互联网 发布:学生证办理 淘宝 编辑:程序博客网 时间:2024/06/06 04:52

      实验室GPU服务器一般使用者是没有Root权限的,也就是只是普通用户权限。我们实验室服务器安装的Opencv都是最新的OpenCV 3.2版本,而我要跑的程序(GPU提取视频光流特征)是依赖于Cuda版本的OpenCV2.4 。因此我需要在我的目录下安装OpenCV 2.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



原创粉丝点击