這篇博客主要內容:
- opencv3.3.0和opencv_contrib-3.3.0文件下載地址
- 安裝過程卡死的解決方案,ippicv和face_landmark_model文件手動下載鏈接
- opencv環境變量設置
- 編輯opencv注意事項.
- 安裝多個版本opencv,編譯如何指定版本
關於opencv_contrib模塊的概述,請參考博客:OpenCV_contrib模塊概述
一. 文件下載和準備
1. 下載及解壓
(1) opencv3.3.0下載地址:github
(2) opencv_contrib-3.3.0三種下載地址:github 百度網盤, 提取碼: k9g2 CSDN下載
下載解壓完之後,將opencv_contrib-3.3.0移動到opencv3.3.0目錄下.
2. 更新
sudo apt-get update && sudo apt-get upgrade
3. 安裝依賴項
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
若電腦未安裝cmake,則需要先安裝cmake,參考其他博客
二. 開始安裝
1. 我的電腦之前安裝過opencv3.1.0(沒有安裝opencv_contrib),這次把opencv的prefix目錄放在/usr/local/opencv3.3.0中.
cd xxx/opencv3.3.0;//進入到存放opencv3.3.0的目錄
mkdir build && cd build;
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/opencv3.3.0 -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.3.0/modules/ -DOPENCV_ENABLE_NONFREE=True ..
注意:
(1) 如果你之前未安裝過opencv,則將CMAKE_INSTALL_PREFIX=/usr/local/opencv3.3.0
改爲CMAKE_INSTALL_PREFIX=/usr/local
即可,注意,後面的環境變量的路徑也要跟着修改.
(2) OPENCV_EXTRA_MODULES_PATH
就是opencv_contrib-3.3.0下面的modules目錄,需自己修改.
(3) -DOPENCV_ENABLE_NONFREE=True
,這句話意思是安裝opencv專利模塊,非常重要.
2. 解決cmake過程中,卡在IPPICV 和 face_landmark_model.dat下載的問題
(1) 手動下載:
- ippcv: ippicv_2017u3_lnx_intel64_general_20170822.tgz
- face_landmark_model: face_landmark_model.dat
(2) 修改配置文件 - ippicv
gedit xxx/opencv-3.3.0/3rdparty/ippicv/ippicv.cmake
上面的xxx爲自己的opencv-3.3.0的路徑.然後修改ippicv.cmake的第47行,修改爲自己下載的ippicv文件的路徑:
#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" #修改前
"file:///home/xtl/package/opencv-3.3.0/ippicv_2017u3_lnx_intel64_general_20170822" #修改後
(3) 修改配置文件 - face_landmark_model
gedit xxx/opencv-3.3.0/opencv_contrib-3.3.0/modules/face/CMakeLists.txt
上面的xxx爲自己的opencv-3.3.0的路徑,然後修改CMakeLists的第19行,修改爲自己下載的dat路徑:
"file:///home/xtl/package/opencv-3.3.0/face_landmark_model.dat"
3. 重新編譯
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/opencv3.3.0 -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.3.0/modules/ -DOPENCV_ENABLE_NONFREE=True ..
sudo make -j4
make過程中,等待時間較長,不要着急,我跑了半個小時,有些可能更長.
然後安裝:
sudo make install
安裝完畢之後,看到下面的結果,恭喜你,opencv3.3.0和opencv_contrib安裝成功了!就差需要配置環境變量了.
三. 設置環境變量
1. 添加opencv庫路徑
注意,這裏根據上面第二節第1點中的路徑相應修改。
sudo gedit /etc/ld.so.conf.d/opencv.conf
添加目錄:
/usr/local/opencv3.3.0/lib
2. 添加pkg環境變量
sudo gedit /etc/profile
在文本後添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/opencv3.3.0/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.3.0/lib/pkgconfig
注意,如果之前有定義過LD_LIBRARY_PATH
或者PKG_CONFIG_PATH
,那麼只需要將/usr/local/opencv3.3.0/lib
加在後面即可,用:分開.比如:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx:/usr/local/opencv3.3.0/lib
其中,xxx
表示之前添加的目錄.
3. 添加bash環境變量
sudo gedit /etc/bash.bashrc
在文本後添加(注意,這裏根據上面第二節第1點中的路徑相應修改):
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.3.0/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/opencv3.3.0/lib
同樣,跟上面第2點中的注意事項一樣,如有,則添加在後面即可.然後
source /etc/bash.bashrc
4. 更新系統緩存
sudo ldconfig
sudo updatedb
四. 測試
pkg-config --modversion opencv
pkg-config --cflags opencv
pkg-config --libs opencv
五. 查看OpenCV程序鏈接到的opencv版本信息
1. 在CMakeLists文件中的add_executable()
前加入:
message(STATUS "OpenCV library status:")
message(STATUS "version: ${OpenCV_VERSION}")
message(STATUS "libraries:${OpenCV_LIBS}")
message(STATUS "include path:${OpenCV_INCLUDE_DIRS}")
然後在cmake ..
的時候,就會打印出鏈接到的opencv的版本等信息.
2. 使用ldd
命令
對於ubuntu下已經編譯好的可執行文件,也就是add_executable(xxx main.cpp)
中的第一個命名文件xxx.
ldd xxx
即可打印出該可執行文件鏈接到的所有庫的名字和版本信息.
3. 如果找不到opencv路徑,或者依然鏈接到了之前的版本
對於找不到opencv路徑的解決辦法:在CMakeLists中的find_package(OpenCV REQUIRED)
之前添加:
set (CMAKE_PREFIX_PATH "/usr/local/opencv3.3.0")
對於依然鏈接到之前版本的opencv,比如我的鏈接到了之前的opencv3.1,則修改CMakeLists中:
find_package( OpenCV 3.3 REQUIRED )
這樣就限制了至少要大於3.3的opencv版本.
六.cmake時指定版本opencv
通常我們可以用find_package(OpenCV 3.3.0 REQUIRED)
使得編譯器,只會找高於或等於3.3.0版本的opencv,但是如果我們還安裝了opencv3.4.0呢?
或者像博主一樣,即使只裝了一個opencv3.3.0,但是由於裝了ros,ros帶有opencv3.3.1,cmake默認指向了ros的opencv,我想指向我安裝的opencv3.3.0,應該怎麼辦呢?
1.讓cmake找到指定版本的opencv的OpenCVConfig.cmake文件
在find_package(OpenCV REQUIRED)
前加上:
#OpenCVConfig.cmake所在的文件目錄
set(OpenCV_DIR "/usr/local/opencv3.3.0/share/OpenCV")
2.直接指定頭文件目錄
在find_package(OpenCV REQUIRED)
前加上:
set(OpenCV_INCLUDE_DIRS "/usr/local/opencv3.3.0/include")