您的位置:首页 > 运维架构

ubuntu16.04 下安装加入opencv_contribute包的GPU版本的OpenCV3.2(CUDA支持)步骤与问题解决

2017-10-26 11:36 1281 查看
首先肯定是先安装依赖了,官方列出了一些:

sudo apt-get install build-essential

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

sudo apt-get install –assume-yes libopencv-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev
libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev

反正不管了,全部都装上去。 

下载opencv和opencv_contrib(后者会在cmake配置的时候用到),这是因为opencv3以后SIFT和SURF之类的属性被移到了contrib中,。
$ wget https://github.com/opencv/opencv/archive/3.1.0.zip # 从github上直接下载或者clone也可
$ wget https://github.com/opencv/opencv_contrib/archive/3.1.0.zip[/code] 


配置编译opencv (NVIDIA CUDA版本)

opencv最麻烦的地方就是编译是属性的配置,对于不同的需求要配置不同的属性。

cd opencv-3.2.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D OPENCV_EXTRA_MODULES_PATH=~/WYZ/download/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D BUILD_TIFF=ON ..


在cmake打印的信息中确认下CUDA和CUDALS的状态是否是YES:

[plain] view
plain copy

--     Use Cuda:                    YES (ver 8.0)  

--     Use OpenCL:                  YES  

--   

--   NVIDIA CUDA  

--     Use CUFFT:                   YES  

--     Use CUBLAS:                  YES  

--     USE NVCUVID:                 NO  

--     NVIDIA GPU arch:             11 12 13 20 21 30 35  

--     NVIDIA PTX archs:            30  

--     Use fast math:               YES  

确认无误后就可以安装了

[plain] view
plain copy

make    

sudo make install   

make的时候遇到了很多问题,比如



linux/videodev.h : no such file or directory


解决方法是

sudo yum install libv4l-devel
sudo ln -s /usr/include/libv4l1-videodev.h   /usr/include/linux/videodev.h


后来又出现了如下问题
Error
“sys/videoio.h - not found” OpenCV 3.1.0
查了很多资料,都没解决,并且一键安装了opencv所有需要的依赖,不过这条命令虽然省事,但是会下来一些当前版本不需要的依赖,耗费比较大的空间和流量,但是也是病急乱投医吧

sudo apt-get build-dep opencv
安装完之后还是不行,后来查了很多资料,有一个说内核版本,gcc版本不够,忽然意识到之前为了装CUDA,把gcc降级到4.9了
于是需要升级gcc,改用16.04默认的gcc5.4。输入命令,查看当前gcc版本
gcc -v

由于新安装的gcc会覆盖掉默认的,所以只能找到新安装的cuda版本
步骤是
sudo apt-get autoremove gcc-4.9 //卸载cc-4.9
此时运行
gcc -v
会没有gcc版本显示,必须将gcc-5.4重新设为默认gcc
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5.4 40
设定gcc-5.4为可选用的gcc(当前只有一个,所以就是默认的),优先级为40
此时会蹦出来一个警告,关于已经卸载的gcc-4.9,不用理会

这样就完成了升级,此时再重新cmake,再make就能顺利完成了!

上面的过程基本上完成了opencv的安装。但是并不能够马上用它,opencv还包含很多动态链接库。你可以在文件/etc/ld.so.conf中添加 /usr/local/lib(这个跟安装目录有关, {CMAKE_INSTALL_PREFIX}/lib),也可以在/etc/ld.so.conf.d
目录下增加一个conf文件(可以命名为 opencv.conf),同样添加 /usr/local/lib



           使用下面的动态库管理命令ldconfig,让opencv的相关链接库被系统共享

[plain] view
plaincopy

sudo ldconfig -v  

      5.  完成了动态库的共享,还不能使用opencv来编程,还需要为程序指定openvc的头文件位置。这里使用pkg-config命令来完成。首先在
/etc/profile 中添加

[plain] view
plaincopy

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



           pkg-config 维护着一个关于opencv的配置文件,这个文件(opencv.pc)在目录 /usr/local/lib/pkgconfig,这个文件记录着opencv的一些动态库信息,还有头文件信息



通过pkg-config 命令可以列出关于opencv的配置信息:



之后如果需要编译依赖opencv的代码

第一种方法:Command Line(使用命令行参数的方法)

gcc Test.c -o Test `pkg-config --cflags --libs opencv`
./Test baboon.jpg


  在这里我稍微解释下这条命令的作用吧。

  在上面的编译命令中我们其实用到了一个工具“pkg-config”,它主要有以下几个功能:
检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
获得编译预处理参数,如宏定义,头文件的位置。
获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
自动加入所依赖的其它库的设置

  所有有了这个工具之后我们的编译就很方便了(不过在此之前你要确保你安装的OpenCV的安装链接库文件的目录下有一个pkgconfig文件夹,在该文件夹里面有个opencv.pc的文件,其实这就是pkg-config下OpenCV的配置文件)。

  使用pkg-config时,选项--cflags 它是用来指定程序在编译时所需要头文件所在的目录,选项 --libs则是指定程序在链接时所需要的动态链接库的目录。例如我下面这张图就显示了我电脑上OpenCV的相关目录。

  


  

  第二种方法:使用OpenCV推荐的CMake工具

  这个方法,我郁闷了很久,试了各种办法,最终还是编译运行成功啦。一把心酸泪啊。

   下面我就一步步介绍下步骤吧:

  step1:新建一个目录用于存放我们的代码和程序中要处理的相关图片

  


 

 

  step2:添加cmake工具编译时所需的文件CMakeLists.txt

  


  CMakeLists.txt文件中的具体内容如下(注:这个文件你可以到你的OpenCV源代码解压出来的文件夹下的/samples/c/example_cmake/文件夹下拷过来,然后再做修改)。

  下面我就简要的介绍下这里面内容的大概意思吧

[cpp] view
plain copy
 
 





PROJECT(OpenCV_Example)           //这是建立一个工程项目(类似于我们VS中建立C++项目一样),括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字  

  

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)    //这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具的版本信息,我们可以使用命令“cmake --version”查看  

if(COMMAND cmake_policy)              

      cmake_policy(SET CMP0003 NEW)  

endif(COMMAND cmake_policy)  

   

FIND_PACKAGE( OpenCV REQUIRED )   //这是cmake用来查找opencv包用的,不用改  

  

# Declare the target (an executable)  

ADD_EXECUTABLE(OpenCV_Example  Image_show.c)      //这里括号里面的两个参数分别是工程项目名和我们要编译文件名的意思,记住中间一空格键隔开  

  

TARGET_LINK_LIBRARIES(OpenCV_Example ${OpenCV_LIBS})  //这是我们链接到OpenCV库的环节,我们只要更改前面第一个参数位我们的工程项目名即可  

  

#MESSAGE(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")     //好了,就修改这么点东西,保存,关闭。  

  然后我们就将终端的工作目录切换到我们建立工程文件的这个目录

  (注意,千万要注意:你这时一定要查看你安装OpenCV时建立的那个编译文件,有没有带锁的标志(即你编译OpenCV是用root权限编译的),就这点就把我坑惨了,例如的我电脑上显示的就是这样的


  看到上面图片中的build文件夹没,那就是我编译OpenCV源代码时建立的文件夹。)

  所以,如果你是以root的权限编译的OpenCV此时你就要以切换到root用户,再切换到当前的工作目录。如果不是用root权限编译的OpenCV编译的话,你就直接切换目录就OK了。

  我的电脑是要切换到root状态的

  


 

 

  Step3:让后我们输入命令"cmake ."对当前的工程进行编译。啊哦,这时你就会发现你编译时出现了一个Bug

  


  这个警告的大概意思就是:Cmake找不到OpenCV的链接库文件,你需要手动地设置OpenCV_DIR来指向包含库文件的路径。

  好吧,这是最蛋疼的地方,就这个问题我google和上StackOverFlow都没有找到答案,只能自己尝试了,不过还是找到网友给的一些提示。

  其实通过它给我们的提示我们就是要设置好这个路径。接下来我们通过camke的qt界面进行设置吧。

  

  Step4:设置OpenCV_DIR

  (1)先安装cmake的qt界面 "sudo apt-get install cmake-gui"

  (2)打开cmake-gui界面

    


  (3)我们这是就在Where is the source code 和 where to build binaries 的选项里选择我们的目录刚才建立包含我们程序的文件路径吧。

    


  (4)我们选择cmake界面中的“Add Entry”选项,按照我下面图中的方式输入信息吧,其中alue值就是我OpenCV安装的那个目录(回想下我上面说的)。

    


    这样我们就点击ok吧,得到下面的图了

    


    到此OpenCV_DIR就配置完成了,单击下面的Configure和Generate,如果没报错则一切搞定啦。我们可以愉快的回到终端编译我们的程序啦。

  (5)编译的方式如图所示

   


   看到了吗,绿色OpenCV_Example就是我们刚生成的可执行文件,到此大功告成啊。

  

   Step5:运行测试吧

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: