天天看點

Linux下opencv4的c++接口版本的安裝

系統是ubuntu16,安裝方式網上資料一大把,這裡把基本流程介紹下,然後介紹下自己解決的問題:

先下載下傳,然後安裝各種依賴,然後:

(預先解決Q1,Q2的問題)

step1.生成makefile,如下是最基本的cmake選項,不用增加其他額外的就能安裝成功。

cd opencv-4.1.0
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release ..
           

(預先解決Q6, Q7, Q8的問題)

如果是同時安裝opencv和opencv_contrib,則先要把opencv_contrib解壓縮到opencv主安裝檔案夾的根目錄下,也就是opencv/opencv_contrib這樣的檔案夾嵌套和檔案名,這是接下來cmake語句的要求結構。然後把上面語句換成如下,其中cmake的編譯選項每一項都不能缺少。

cd opencv-4.1.0
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -D OPENCV_ENABLE_NONFREE:BOOL=ON ..
           

step2.編譯,make -j8,

step3.安裝,sudo make install

安裝過程可能的問題:

Q1. 編譯時提示ippicv庫無法下載下傳?

原因是github下載下傳太慢,解決辦法是手動下載下傳,然後随便放到什麼位置(我是放到opencv安裝檔案夾下),然後修改opencv安裝檔案/3rdparty/ippicv/ippicv.cmake檔案中如下标記的一行,也就是指定下載下傳檔案為本地檔案的路徑。

ocv_download(FILENAME ${OPENCV_ICV_NAME}
               HASH ${OPENCV_ICV_HASH}
               URL
                 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
				"file:///media/ubuntu/4430C54630C53FA2/SuLiang/Mysoftwares/opencv-4.1.0/"  # 這行修改成自己路徑
               DESTINATION_DIR "${THE_ROOT}"
               ID IPPICV
               STATUS res
               UNPACK RELATIVE_URL)
           

Q2. 編譯時提示無法識别anaconda的庫檔案undefined reference to ZSTD_freeCStream’ //home/a401/anaconda3/lib/libtiff.so.5

解決辦法參考:https://blog.csdn.net/Splend520/article/details/97270438,也就是把build路徑時的跟annaconda環境變量去除。

echo $PATH  #可以看到如下顯示的有跟anaconda相關的路徑
/home/ubuntu/anaconda3/bin:/home/ubuntu/anaconda3/condabin:/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/cuda-9.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

export PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/cuda-9.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin   # 去除
           

Q3. 安裝時提示無法拷貝檔案?

原因是權限問題,需要用sudo make install

Q4. 安裝好以後無法導入視訊類videoCapture?

原因是視訊庫”opencv2/videoio.hpp”沒有安裝,因為在highgui.hpp庫中,可以看到如下一段,其中opencv2/videoio.hpp是處于無法連結到源檔案的未安裝狀态。

#ifdef HAVE_OPENCV_VIDEOIO

#include “opencv2/videoio.hpp”

#endif

想了很多方法包括補充相關庫都沒效果,最後換一個opencv版本嘗試下。

于是解除安裝opncv3.5: 進入opencv的build安裝目錄, 運作sudo make uninstall即可。

然後安裝opencv4.1版本,發現在make -j8的編譯過程有built target opencv_videoio.

安裝完成後,正常。

Q5. 安裝好以後的導入

  • 方式1:預先把安裝在/usr/local/lib和/usr/local/include/opencv的頭檔案和庫檔案添加到系統變量中,進而可以直接在程式中引用包含相關opencv頭檔案。

    原因是系統隻會搜尋預設路徑/lib和/usr/lib的動态庫,其他路徑的動态庫無法被直接搜尋到.

  • 方式2:不用預先把opencv的頭檔案和庫檔案加入系統變量,則需要在cmakelists中先包含安裝的頭檔案和庫檔案路徑,然後才可以在程式中引用包含相關opencv頭檔案。

    以下是一個最簡CmakeLists, 注意:opencv4之後需要c++11的支援。

cmake_minimum_required(VERSION 3.5)
project(3000_start_opencv LANGUAGES CXX)
add_definitions(-std=c++11) #c++11
find_package( OpenCV 4.1.0 REQUIRED ) #opencv
include_directories( ${OpenCV_INCLUDE_DIRS} ) #opencv
add_executable(3000_start_opencv main.cpp)
target_link_libraries( 3000_start_opencv ${OpenCV_LIBS}) #opencv
           

Q6. contrib庫編譯錯誤,編譯時會針對contrib包提示部分檔案下載下傳失敗,編譯失敗無法安裝:

主要的檔案包括:

boostdesc_bgm.i

boostdesc_bgm_bi.i

boostdesc_bgm_hd.i

boostdesc_lbgm.i

boostdesc_binboost_064.i

boostdesc_binboost_128.i

boostdesc_binboost_256.i

vgg_generated_120.i

vgg_generated_64.i

vgg_generated_80.i

vgg_generated_48.i

需要手動去下載下傳,然後拷貝到opencv_contrib/modules/xfeatures2d/src/路徑下即可

參考的下載下傳路徑可以搜尋到,這裡就不提供了。

Q7. contrib庫編譯時會報錯找不到contrib測試時需要的opencv/module包裡的檔案:~/opencv-4.2.0/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp:51:62: fatal error: features2d/test/test_detectors_regression.impl.hpp: No such file or directory

也就是找不到這個檔案test_detectors_regression.impl.hpp但我在features2d/test/路徑下能找到這個檔案。根本原因是在contrib安裝時無法連結到opencv包裡邊的test支援檔案,解決辦法就是把所有缺失的相關檔案從opencv/modules/feature2d/test檔案夾都拷貝到opencv/contrib/modules/xfeatures2d/test檔案夾中,并且手動修改contrib中報錯的那幾個test_xxx檔案中頭檔案的include路徑,都從features/modules修改到本地,比如:

// #include "features2d/test/test_detectors_regression.impl.hpp"
// #include "features2d/test/test_descriptors_regression.impl.hpp"
// 上面是原代碼,修改為如下形式
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"
           

Q8. 安裝成功contrib庫,但調用SIFT算法依然報錯This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function ‘create’

這是因為SIFT/SURF算法都受版權保護,不能直接使用,解決辦法參考:https://answers.opencv.org/question/201938/how-can-i-set-opencv_enable_nonfree-cmake-option-and-rebuild-the-library-in-function-create/

即需要在編譯時增加選項-D OPENCV_ENABLE_NONFREE:BOOL=ON

繼續閱讀