1. 程式人生 > >Ubuntu16.04下安裝OpenCV3.2.0

Ubuntu16.04下安裝OpenCV3.2.0

opencv基本上是搞CV必備套件之一了,支援的語言也非常多,但是安裝起來有點麻煩(如果是在conda下安裝的話則可以用conda install -c menpo opencv3=3.2.0)。需要注意的是,pip可以安裝的opencv-python安裝並不依賴opencv,只是封裝了opencv的Python API,一般情況下也夠用。但是如果準備安裝完整版本的opencv,這裡比較建議將opencv-python解除安裝,以免之後產生一些不必要的報錯。 通過官方文件和一些部落格總結的安裝流程大致如下:

1.安裝官方給的opencv依賴包

  • GCC 4.4.x or later
  • CMake 2.6 or higher
  • Git
  • GTK+2.x or higher, including headers (libgtk2.0-dev) # 控制opencv GUI
  • pkg-config
  • Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)
  • ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev
  • [optional] libtbb2 libtbb-dev
  • [optional] libdc1394 2.x
  • [optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
$ 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 libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
$ sudo apt-get install libxvidcore-dev libx264-dev # 處理視訊所需的包
$ sudo apt-get install libatlas-base-dev gfortran # 優化opencv功能
$ sudo apt-get install ffmpeg

** 注:**其他一些包在之後的cmake的時候缺失的時候會進行安裝,如果安裝失敗可以手動下載相應的包然後放入提示的目錄下。而cmake下載tar.gz檔案的時候可能不支援,需要進行配置,具體操作可以參考這裡

2.下載opencv3.2.0

這裡需要下載opencv和opencv_contrib(後者會在cmake配置的時候用到),這是因為opencv3以後SIFT和SURF之類的屬性被移到了contrib中,。

$ wget https://github.com/opencv/opencv/archive/3.2.0.zip # 從github上直接下載或者clone也可
$ wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip

3a.配置編譯opencv (無NVIDIA CUDA版本)

將上述opencv包解壓,然後cmake配置屬性

$ cd opencv-3.2.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/home/fanzong/anaconda2/envs/tensorflow \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
    -D PYTHON_EXCUTABLE=/home/fanzong/anaconda2/envs/tensorflow/bin/python \
    -D WITH_TBB=ON \
    -D WITH_V4L=ON \
    -D WITH_QT=ON \    # 1
    -D WITH_GTK=ON \
    -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON .. # cmake命令的使用方式:cmake [<some optional parameters>] <path to the OpenCV source directory>。如果命令報錯的話可以試著把-D後面的空格去掉在執行一次。
$ make -j4
$ sudo make install
$ sudo /bin/bash -c 'echo "/home/fanzong/anaconda2/envs/tensorflow/lib" > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig

PS:1. 如果qt未安裝可以刪去此行;若因為未正確安裝qt導致的Qt5Gui報錯,可將build內檔案全部刪除後重新cmake,具體可以參考這裡 CMAKE_INSTALL_PREFIX:安裝的python目錄字首,其實就是指定了python模組的安裝路徑:CMAKE_INSTALL_PREFIX/lib/python2.7/dist-packages。獲取該路徑的方式可以用python -c "import sys; print sys.prefix" PYTHON_EXCUTABLE:指定python路徑 OPENCV_EXTRA_MODULES_PATH: 指定opencv所需模組的路徑,就是之前我們所說的contrib 其他cmake的具體變數說明可以看這裡

3.b 配置編譯opencv (NVIDIA CUDA版本)

opencv最麻煩的地方就是編譯是屬性的配置,對於不同的需求要配置不同的屬性。當使用NVIDIA GPU GeForce 1080ti的時候:

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
    -D PYTHON_EXCUTABLE=/usr/bin/python \
    -D WITH_CUDA=ON \    # 使用CUDA
    -D WITH_CUBLAS=ON \
    -D DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" \
    -D CUDA_ARCH_BIN="5.3" \    # 這個需要去官網確認使用的GPU所對應的版本[檢視這裡](https://developer.nvidia.com/cuda-gpus)
    -D CUDA_ARCH_PTX="" \
    -D CUDA_FAST_MATH=ON \    # 計算速度更快但是相對不精確
    -D WITH_TBB=ON \
    -D WITH_V4L=ON \
    -D WITH_QT=ON \    # 如果qt未安裝可以刪去此行;若因為未正確安裝qt導致的Qt5Gui報錯,可將build內檔案全部刪除後重新cmake,具體可以參考[這裡](http://stackoverflow.com/questions/17420739/opencv-2-4-5-and-qt5-error-s)
    -D WITH_GTK=ON \
    -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON ..

3.c 配置編譯opencv(NVIDIA Jetson TX2開發板)

目前官方提供的opencv4tegra是2.4版本的,尚不支援3.2版本,所以需要自己編譯。

$ cmake -D WITH_CUDA=ON \
    -D CUDA_ARCH_BIN="6.2" \  # 安裝了6.2版本
    -D CUDA_ARCH_PTX=""  \
    -D WITH_OPENGL=ON  \
    -D WITH_LIBV4L=ON \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local ..

PS:不需要安裝contrib包,否則之後呼叫攝像頭調整解析度的時候會失敗。具體安裝細節可以參考這裡 編譯成功時應該看到這些:

  1. CUDA8.0
--   Other third-party libraries:
--     Use Cuda:                    YES (ver 8.0)
--   NVIDIA CUDA
--     Use CUFFT:                   YES
--     Use CUBLAS:                  NO
--     USE NVCUVID:                 NO
--     NVIDIA GPU arch:             53
--     NVIDIA PTX archs:
--     Use fast math:               NO
  1. OpenGL
--   GUI: 
--     GTK+ 2.x:                    YES (ver 2.24.30)
--     OpenGL support:              YES (/usr/lib/aarch64-linux-gnu/libGLU.so /usr/lib/aarch64-linux-gnu/libGL.so)
  1. VideoIO
--   Video I/O:
--     DC1394 2.x:                  YES (ver 2.2.0)
--     FFMPEG:                      YES
--       codec:                     YES (ver 54.92.100)
--       format:                    YES (ver 54.63.104)
--       util:                      YES (ver 52.18.100)
--       swscale:                   YES (ver 2.2.100)
--       gentoo-style:              YES
--     GStreamer:
--       base:                      NO
--       video:                     NO
--       app:                       NO
--       riff:                      NO
--       pbutils:                   NO
--     V4L/V4L2:                    Using libv4l (ver 1.0.0)

注:GPU版本安裝的時候很容易出錯,這裡說的出錯並不是編譯報錯,而是在python中呼叫的時候報錯,比如cv2.VideoCapture(0)返回false,cv2.imshow()的時候報unspecified error。在呼叫cv2的時候報錯一般都是在cmake配置編譯的時候由於配置錯誤導致的,所以需要確認配置的引數是否能夠覆蓋到你所需的範圍。 關於GPU版本的安裝也可以參考下這裡,寫得更加詳細清楚。

4.完成安裝並測試

安裝完成以後,重啟下機器。編譯之後應該會在CMAKE_INSTALL_PREFIX/lib/python2.7/dist-packages/目錄下找到cv2.so。開啟python console,檢測opencv版本python -c "import cv2; print cv2.__version__"。如果正確安裝的話則會輸出3.2.0。PS:如果import的時候報類似於error while loading shared libraries: libopencv_core.so.3.0: cannot open shared object file: No such file or directory.的錯誤,可能是library環境變數的錯誤,可以嘗試將export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib加入到~/.bashrc中然後source。

參考