ubuntu系統編譯安裝OpenCV 4.4

內容轉載自我的博客

前言

如果你只是想要使用C++或者Python語言來調用OpenCV,而且並不關心OpenCV是否為最新版本,那麼請直接按照如下代碼:
sudo apt update && sudo apt install libopencv-dev python3-opencv
前者libopencv-dev是用於C++開發的庫(已經很老舊了)
後者python3-opencv是用於python3開發的庫,你可以在終端輸入
/usr/bin/python3 -c "import cv2;print(cv2.__version__)"來驗證python3-opencv是否安裝成功
/usr/bin/pip3 install opencv-contrib-python==3.4.2.17來安裝擴展功能(3.4.2版本以後的預編譯庫中都不會再加入non-free模塊)

1. 下載源碼

在官方網站下載最新源代碼(截止本文測試時,最新版本為4.4.0),如果需要使用SIFT算法等擴展功能,下載opencv_contrib一起編譯:

例如,opencv 4.4源碼解壓到當前目錄下,opencv_contrib 4.4也解壓到當前目錄下

2. 安裝各種依賴

按照如下步驟:

# 安裝系統依賴
sudo apt install build-essential cmake git libgtk2.0-dev \
                 pkg-config libavcodec-dev libavformat-dev libswscale-dev \
                 libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
                 libjasper-dev libdc1394-22-dev 
# 添加源以繼續安裝依賴libjasper
sudo add-apt-repository "deb //security.ubuntu.com/ubuntu xenial-security main"
# 安裝系統依賴
sudo apt install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
                 libjasper-dev libdc1394-22-dev libsnappy-dev libboost-all-dev \
                 python3-dev python3-numpy ffmpeg cmake-qt-gui libopenblas-dev \
                 tesseract-ocr libtesseract-dev libprotobuf-dev libleveldb-dev \
                 libhdf5-serial-dev protobuf-compiler libatlas-base-dev \
                 libgflags-dev libgoogle-glog-dev liblmdb-dev libfaac-dev \
                 gfortran libgstreamer1.0-dev libatlas-base-dev libxvidcore-dev \
                 libpng-dev libopenexr-dev libtiff-dev libwebp-dev \
                 libmp3lame-dev libtheora-dev libvorbis-dev  \
                 libopencore-amrwb-dev x264 v4l-utils libgdk-pixbuf2.0-dev \
                 manpages-dev libopencore-amrnb-dev libgstreamer-plugins-base1.0-dev \
                 libqt5widgets5 libqt5gui5 libqt5dbus5 libqt5network5 libqt5core5a \
                 qtcreator qt5-default
# 修復可能安裝出錯的依賴
sudo apt install -f

3. 開始編譯安裝

按照以下步驟:

# 在opencv4.4源碼解壓後的文件夾下面,創建編譯文件夾
mkdir build && cd build
# 配置編譯選項
# CMAKE_INSTALL_PREFIX 是最終OpenCV的安裝位置
# OPENCV_ENABLE_NONFREE 指示是否開啟Non-free的算法
# OPENCV_EXTRA_MODULES_PATH 指示擴展算法的源碼文件夾
# WITH_CUDA 該選項需要確保自己已安裝顯卡驅動和cuda
# 可以關注下命令的輸出,可以從中找到哪些模塊沒有配置成功
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.4 \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/home/zfb/opencv_contrib-4.4.0/modules \
      -D OPENCV_GENERATE_PKGCONFIG=YES \
      -D WITH_QT=ON \
      -D WITH_OPENGL=ON \
      -D WITH_CUDA=ON \
      -D BUILD_EXAMPLES=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=ON ..
# 開啟12個線程同時編譯源碼
make -j12
# 安裝OpenCV到指定位置
sudo make install

4. 配置C++開發環境

按照以下步驟:

# 查看該文件是否存在(OPENCV_GENERATE_PKGCONFIG=YES參數保證此文件存在)
cat /usr/local/opencv4/lib/pkgconfig/opencv4.pc
# 把上面的文件添加到PKG_CONFIG_PATH
sudo vim /etc/profile.d/pkgconfig.sh
# 文件內容如下
# export PKG_CONFIG_PATH=/usr/local/opencv4/lib/pkgconfig:$PKG_CONFIG_PATH
# 激活文件
source /etc/profile
# 驗證配置,如果不報錯則說明正常
pkg-config --libs opencv4

5. 程序執行時加載動態庫*.so

按照以下步驟:

# 將OpenCV的庫添加到路徑
sudo vim /etc/ld.so.conf.d/opencv4.conf
# 添加內容如下(也可能是空文件)
# /usr/local/opencv4.4/lib
# 更新配置
sudo ldconfig

6. 測試cpp文件

按照以下步驟:

# 進入下載的opencv4.4的源碼文件夾下的samples目錄
cd samples/cpp/example_cmake
# 配置編譯選項
cmake .
# 開始編譯文件
make
# 執行測試代碼,彈出窗口實時顯示攝像頭畫面
./opencv_example

7. 配置python3的opencv環境

首先需要找到編譯好的用於python3的動態庫文件的位置,可以使用如下代碼搜索(其實在sudo make install時也會顯示):
sudo find / -iname "cv2*.so"
得到路徑為/usr/local/opencv4.4/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so
然後把它複製到對應python解釋器的/path/to/dist-packages(系統自帶的python解釋器)和/path/to/site-packages(用戶安裝的python解釋器)目錄下,之後就能在該python解釋器中使用python-opencv庫:

# 查看系統Python環境的包路徑
/usr/bin/python3 -c "import pip;print(pip)"
# 創建軟鏈接使得/usr/bin/python3可以使用opencv
sudo ln -s /usr/local/opencv4.4/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so
# 測試安裝結果
/usr/bin/python3 -c "import cv2;print(cv2.__version__)"

8. 卸載編譯安裝的OpenCV

  1. 進入編譯時的文件夾cd build
  2. 執行卸載命令sudo make uninstall,此命令會刪除安裝時添加的所有文件,但是不處理文件夾
  3. 根據上一個命令的回顯,刪除目的文件夾的與該軟件有關的空文件夾