Ubuntu1804 安裝opencv-4.1.0 + opencv_contrib-4.1.0(最終版)
文章目錄
- Ubuntu1804 安裝opencv-4.1.0 + opencv_contrib-4.1.0(最終版)
- 一、環境
- 二、準備
- 三、camke
- 四、安裝的最後一步
- 五、C++ 環境配置
- 5.1 測試一:顯示 OpenCV 版本號
- 5.2 測試二:運行一個簡單的程序,注意放張圖片進去。
- 5.3 這兩個測試說明了什麼?
- 5.4 新建一個 opecv.pc (勾選了就跳過此步驟,勾選生成的opencv4.pc 我印象中好像不用修改的,不放心可以打開看看確認一下 )
- 5.5 那麼這個 opencv.pc 要放在哪裏?
- 5.6 配置庫路徑
- 5.7 c++ 環境配置的總結:
- 六、python2 和 python3 環境配置(不用python 可以跳過)
- 七、驗證
- 八、問題
- 1. ippicv,face_landmark_model等下載錯誤
- 2. virtual memory exhausted: Cannot allocate memory
- 3. undefined reference to symbol '_ZN2cv8fastFreeEPv' undefined reference to symbol '_ZN2cv8fastFreeEPv'
- 4. 運行錯誤
- 參考:
- 1. [Package OpenCV not found? Let’s Find It.](https://prateekvjoshi.com/2013/10/18/package-opencv-not-found-lets-find-it/)
- 2. [【安裝教程】Ubuntu16.04 中用 CMake-gui 安裝 OpenCV3.2.0 和 OpenCV_contrib-3.2.0(圖文)](https://blog.csdn.net/jindunwan7388/article/details/80397700)
- 3. [OpenCV 4.1 編譯和配置](https://www.cnblogs.com/xinxue/p/5766756.html)
- 4. [pkg-config 的用法](
一、環境
1.1 Ubuntu 18.04_x64
1.2 opencv_4.1.0 + opencv_contrib-4.1.0
1.3 python3.6
二、準備
2.1.更新下系統
sudo apt-get update
sudo apt-get upgrade
2.2 安裝依賴包
# 因爲安裝 libjasper-dev 這個依賴包可能會出問題,所以先執行以下命令,在執行後續依賴包的安裝
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
# 而且一路配置過來犯過一些錯(具體錯誤 ——> 問題 4),說 libgtk 依賴要先於 opencv 某些依賴安裝(——> 參考 9),保險起見
sudo apt-get install libgtk-3-dev libgtk2.0-dev pkg-config
# 接下來就可以執行後續命令
# 可以輸入下面的一次裝,省心省力
# 分步裝
sudo apt-get install build-essential
# opencv4.1.0需要 libgtk-3-dev
sudo apt-get install cmake libgtk-3-dev libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python3-dev python3-numpy python-dev python-numpy libpython3.6-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libdc1394-22-dev # 處理圖像所需的包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libxvidcore-dev libx264-dev # 處理視頻所需的包
sudo apt-get install libatlas-base-dev gfortran # 優化opencv功能
sudo apt-get install ffmpeg
# 一次裝 (就是把上面的依賴全部寫成一行,省心,下載過程中有些依賴需要你確認,-y 是替你輸入 y ,省力)
sudo apt-get -y install build-essential cmake libgtk-3-dev libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python3-dev python3-numpy python-dev python-numpy libpython3.6-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev libopenexr-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran ffmpeg
2.3 安裝 cmake GUI
sudo apt-get install cmake-gui
2.4 opencv_4.1.0 + opencv_contrib-4.1.0
# 用以下命令解壓
tar -xzf xxx.tar.gz
得到
三、camke
cd mybuild # mybuild 是我自己創的文件夾,大家可以自定義
cmake-gui ../opencv-4.1.0 # ../opencv-4.1.0 是 CMakeLists.txt 的所在位置,一般在下載的 OpenCV 源碼裏(非contrib)
3.1 按照順序,然後 finish,此時 Configure 按鈕變爲 Stop ,表示配置進行中。
Configure 結束後,如果 cmake 的主界面仍有紅色區域,則再次點擊 Configure 進行配置,直到紅色區域完全消失。
3.2 紅色區域沒了之後,進行下一步的配置
(1)在 CMAKE_BUILD_TYPE 值處選擇 Release
(2)CMAKE_INSTALL_PREFIX 選擇安裝的路徑
這裏我選擇 mybuild 目錄下自己新建的 myInstall 文件夾。
(3)在 OPENCV_EXTRA_MODULES_PATH 處,爲其設置 opencv_contrib-4.1.0 的路徑,精確到 /modules 目錄
(4)勾選 OPENCV_PYTHON3_VERSION
(5)添加 python 的路徑,如下圖:
這個路徑是根據官方文檔設置的。如下圖:
(6) 勾選 OPENCV_GENERATE_PKGCONFIG
這個很重要,是生成 opencv.pc 的,如果沒有勾選就只能自己新建,後面也會提到。血的教訓,而且網上很多教程都沒提到,我是從官方文檔看到的。
-
再次點擊 Configure 進行配置,如果還有紅色就繼續 Configure ,直到沒有紅色纔可進行下一步。
-
紅色區域沒了之後還要注意下圖,紅框圈住的信息欄,滾一下看看有沒有錯誤信息(通常也是紅色字體,很顯眼),一般是下載問題,如果有錯誤信息,就繼續 Configure ,直到沒有錯誤信息。
- 最後,點擊 Generate,出現 “Generating done” 則意味着 cmake 的工作結束了。
四、安裝的最後一步
4.1 在 mybuild 目錄下輸入 sudo make -j2
-j2 意思是用兩個 CPU 去 make ,這樣快很多
cat /proc/cpuinfo | grep "processor" | wc -l #可以查看你的系統多少個 CPU
4.2 然後 sudo make install
此時可以打開 myInstall 文件看看,已經好了。
五、C++ 環境配置
在還沒配置前,先試一下兩個測試:(大家可以不用做,看我操作,當然,自己操作一遍加深印象也未嘗不可)
5.1 測試一:顯示 OpenCV 版本號
# 命令行輸入以下命令
pkg-config --modversion opencv
完了之後你會發現
好,繼續下一個測試
5.2 測試二:運行一個簡單的程序,注意放張圖片進去。
# 輸入下句命令得到 可執行文件 test
g++ showPhoto.cpp -o test `pkg-config --cflags --libs opencv`
完了之後你會發現
5.3 這兩個測試說明了什麼?
- 說明了編譯時還沒找到 opencv 的相關文件(這不廢話嘛,都還沒配置)
有這兩個過程是想大家有個感覺,並且至始至終都是圍繞 opencv.pc
這個文件。
- 並且解釋一下
pkg-config
這個什麼意思,有助於大家理解待會爲什麼這麼去配置環境。
pkg-config
就是我們告訴程序編譯時從哪裏找頭文件和庫相關信息。
那 pkg-config
從哪兒知道這些信息的呢?
它是從包名爲 xxx.pc 這個文件中查找到的。就比如上面兩個測試,它是從 opencv.pc 裏去找,但是問題是我編譯完之後整臺電腦都沒有 opencv.pc 這個文件啊(不信你試試 sudo find / -name opencv.pc
)
那怎麼辦呢?沒有槍沒有炮我們自己造!
當然,這個造大炮的前提是在 步驟 3.2(6)中沒有勾選 OPENCV_GENERATE_PKGCONFIG。如果勾選了就跳過 步驟5.4。
(題外話:步驟 3.2(6)這個跳轉有點坑,先跳到目錄,再從目錄才跳到指定位置,不能直接跳到指定位置。可能是因爲 id 在目錄裏,從上往下找,就先找到目錄的 id 就跳了。)
給大家看看,勾選了和沒勾選的區別
5.4 新建一個 opecv.pc (勾選了就跳過此步驟,勾選生成的opencv4.pc 我印象中好像不用修改的,不放心可以打開看看確認一下 )
現在我們自己造一個 opencv.pc
(下面的代碼中一份是我自己複製的 opencv.pc,一份是官方的 opencv4.pc,大家可以自行選擇(當然是官方的好),然後根據自己路徑修改(下面會提怎麼修改))
vim opencv.pc
# 在裏面輸入以下內容
# 這個是我不知道 OPENCV_GENERATE_PKGCONFIG 選項 的時候複製別人的
# ---------------------開始(這行不用複製)-------------------------
# Package Information for pkg-config
prefix=/home/hzh/opencv/mybuild/myInstall
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.1.0
Cflags: -I${includedir}/opencv4 -I${includedir}/opencv4/opencv2
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_fuzzy -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core
# ---------------------結束(這行不用複製)-------------------------
# 下面這個是我勾選 OPENCV_GENERATE_PKGCONFIG 生成的官方的 opencv4.pc
# ---------------------開始(這行不用複製)-------------------------
# Package Information for pkg-config
prefix=/home/hzh/opencv/mybuild/myInstall
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4/opencv
includedir_new=${prefix}/include/opencv4
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.1.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_video -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
# ---------------------結束(這行不用複製)-------------------------
要注意的是以下我圈住的 5 個框。
(1) prefix
這個是根據自己路徑去設置的(/home/你的名字/你的路徑
),因爲我安裝在 myInstall ,看下圖可以看到 myInstall 是 include 和 lib 的上一級目錄,所以路徑寫到這就好了。切忌寫成 ~/
這樣的路徑(血的教訓)。
(2)includedir
就是包含的頭文件目錄
libdir
就是庫的目錄
(3)Version
這個是你自己安裝opencv的版本
(4)Cflags
這個就起碼精確到 opencv4 ,要不然以後寫程序 可能要 #include<opencv4/opencv2/opencv.hpp>
(5)Libs:
精確到 lib 目錄就好了
大家可以根據自己安裝的路徑去設置。
5.5 那麼這個 opencv.pc 要放在哪裏?
這就又要講到 pkg-config
,它默認會去/usr/lib/pkgconfig
裏面找 opencv.pc 。當它在這裏找不到 opencv.pc ,它就會到 PKG_CONFIG_PATH
所設置的環境變量去找,如果還沒找到就會報錯,比如上兩個測試的報錯。所以:
如果是 opencv4.pc 的就把下面提到的 opencv.pc
改爲 opencv4.pc
,當然你也可以重命名爲 opencv.pc
方法一:移動 opencv.pc 到 /usr/lib/pkgconfig
方法二:把 opencv.pc 放在你想放的路徑,然後
1. 打開 bash.bashrc
sudo gedit /etc/bash.bashrc
2. 在文件後添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/設爲你的opencv.pc的路徑
export PKG_CONFIG_PATH
3. 更新配置
sudo updatedb
關於 pkg-config 更詳細的的介紹 —> 參考 4.
5.6 配置庫路徑
sudo gedit /etc/ld.so.conf.d/opencv.conf
# 添加你自己的 lib 路徑,就比如我的如下:
/home/hzh/opencv/mybuild/myInstall/lib
# 保存後,更新一下
sudo ldconfig
5.7 c++ 環境配置的總結:
(1)把 opencv.pc 放在系統可以找到的地方
(2)添加庫路徑
六、python2 和 python3 環境配置(不用python 可以跳過)
下面以 python3 爲例:
- 首先先找到編譯後,py的opencv庫
- 下兩張圖是 編譯 opencv 時產生的 python3.6 的 opencv 庫
- 自己找到這個庫的路徑之後,然後參考Ubuntu 中 Python 添加第三方庫路徑
- python 2 像 python 3一樣的配置操作步驟,成功如下圖:
七、驗證
7.1 先輸入pkg-config --modversion opencv
如果是 opencv4.pc 的就輸入 pkg-config --modversion openc4
說明找到了 opencv.pc
7.2 編譯一個程序(.cpp)
一樣,如果是 opencv4.pc 的就輸入
g++ showPhoto.cpp -o showPhoto `pkg-config --cflags --libs opencv4`
我想經過這些例子,再加上參考 4的解釋,大家應該知道 pkg-config 和 opencv.pc 的關係了吧?
也說下我的理解:
`pkg-config --cflags --libs xxx ` 告訴程序在 xxx.pc 裏找相應的頭和庫。
所以不管你是 opencv.pc 還是 opencv4.pc 都好,只要你 `pkg-config 後面的 xxx ` 寫成你的 xxx.pc 的名字 xxx 就好了。
編譯成功後生成了可執行文件 showPhoto,執行結果如下:
7.3 編寫程序(.py)
python3 1.py
的運行結果如下:
交互式命令行結果如下:
八、問題
1. ippicv,face_landmark_model等下載錯誤
在 Configure 配置的時候,我遇到了 ippicv_2019_lnx_intel64_general_20180723.tgz
和 face_landmark_model.dat
這兩個文件下載不通,我 Configure 多幾下,它也可以下載完,如果等不及的可以直接下載。教程在下面的 參考 5 ,其他的文件類推。
2. virtual memory exhausted: Cannot allocate memory
出現這個問題的原因也是因爲內存不足
3. undefined reference to symbol ‘_ZN2cv8fastFreeEPv’ undefined reference to symbol ‘_ZN2cv8fastFreeEPv’
這個是因爲 我當時寫的 opencv.pc 有問題 漏了 -lopencv_core ,補上去就好了。
4. 運行錯誤
error:(-2:Unspecified error)The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
what?re-run cmake ?? GG ~
原來當時
所以在安裝依賴項的時候,先把 libgtk-3-dev libgtk2.0-dev pkg-config
給安裝了先,避免不必要的錯誤。