Ubuntu下安裝OpenCV(八): 2.x的安裝與配置

2022-01-02 麟十一

 第 26 篇  |  LINSHIYI 

這是Ubuntu下安裝OpenCV系列的第八篇,也是最後一篇:OpenCV2.x的安裝和配置。本文以OpenCV2.4.10為例,在Ubuntu18.04下使用Release模式進行原始碼編譯,展示從第4步到第10步的完整步驟。

由於之前的幾篇文已經將命令行的概念和每一步的操作原理介紹地很詳細了,所以本文僅會對新出現的命令進行解釋,對重複的概念和相同的操作步驟只做簡要說明。

上圖是這個系列的索引目錄,下面3篇是OpenCV、VC++、Visual Studio以及安裝包中的文件介紹:

 OpenCV配置攻略(一):OpenCV, VC++和VS

 OpenCV配置攻略(二): 安裝包裡都有什麼(上) 

 OpenCV配置攻略(二): 安裝包裡都有什麼(下) 

下面的1-6OpenCV3.4.10+contrib的編譯過程,包括每一步驟的概念介紹、命令解釋、可能出現的問題及解決方法,第7篇是OpenCV4.5.3的編譯和配置過程:

 Ubuntu下安裝OpenCV(一): 準備工作

 Ubuntu下安裝OpenCV(二): CMake編譯(上)

 Ubuntu下安裝OpenCV(七): 4.x的安裝與配置

如果用戶是在Ubuntu16.04下進行安裝,那麼可以直接參考OpenCV3.x的步驟,親測在安裝和配置過程中不會出現報錯,但如果用戶是在Ubuntu18.04下進行安裝,就會有許多警告和報錯出現

出現問題的原因我目前還沒找到官方的答案,匯總各種帖子裡的回答,可以總結為:Ubuntu18.04默認使用的編譯工具、默認下載的安裝包版本都比較高,一些舊的API、使用的策略(Policies)在新版本中已經被棄用,某些函數、宏定義也有了變化。而OpenCV2.x中使用的大多是舊版的內容(已被棄用/更改的內容)

所以,在低版本的Ubuntu下安裝OpenCV2.x時不會出現錯誤,但在高版本的系統下進行編譯和安裝時,就會出現版本不兼容、接口不一致、策略被棄用等問題。

安裝OpenCV2.x和3.x的第一個區別在於2.x版本無需配置額外算法模塊。因為在OpenCV2.x中,名為contrib的模塊下包含的就是額外算法。

contrib文件夾

OpenCV3.0.0開始,開發者才將這些比較新的、沒有經過充分測試的額外算法匯總起來,單獨放在opencv_contrib分支中進行發布。

所以在OpenCV2.x中沒有核心算法和額外算法的區分,用戶只需下載一個核心算法的源碼包即可。在CMake編譯時,也無需設置變量OPENCV_EXTRA_MODULES_PATH的參數。

2.2 CMake編譯

第二個非常的大的區別在CMake編譯部分,由於版本不兼容等問題,我在編譯OpenCV2.x時修改了很多參數才不報錯:

2.x下的CMake編譯

這是OpenCV3.x下的編譯命令:

當然,上圖我只是列出了自己在編譯時用到的變量和參數,用戶可以根據項目要求自行增加或減少CMake變量

接下來從第四步CMake編譯開始,介紹安裝和配置OpenCV2.x的每一個步驟,並展示對應的截圖。前三步(安裝需要的包下載OpenCV原始碼並解壓縮創建構建目錄)見 Ubuntu下安裝OpenCV(一): 準備工作

我將構建目錄的名稱設置為build,用戶可以設置自己喜歡的目錄名稱,一般會以編譯模式release/debug或者build來命名。

如果在編譯過程中出現ippicv壓縮包或其他文件下載失敗的問題,原理解釋見 Ubuntu下安裝OpenCV(二): CMake編譯(上),解決方法見 Ubuntu下安裝OpenCV(三): CMake編譯(下)

3.1 安裝編譯器

在第一節提到過,使用高版本的編譯器進行CMake編譯時會出現許多問題,所以我在這裡安裝了低版本的gcc和g++編譯器來執行編譯任務。參照Ubuntu16.04中默認的編譯器版本,我下載了gcc和g++的5.5.0版本。

在計算機任意位置輸入命令sudo apt-get install gcc-5 g++-5即可進行安裝gcc5.5.0和g++5.5.0編譯器:

Ubuntu18.04默認安裝的編譯器版本為7.5.0,當我們使用gccg++命令時,系統默認的編譯器gcc7.5.0g++7.5.0將會工作;而輸入命令gcc-5g++-5時,我們剛剛安裝的gcc5.5.0g++5.5.0編譯器將會工作。這相當於我們在計算機中安裝了兩個不同版本的編譯器

在計算機任意位置輸入gcc/g++/gcc-5/g++-5 --version即可查詢編譯器的版本信息:

3.2 執行編譯任務

進入構建目錄下,輸入sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-2-4-10-release -D CMAKE_C_COMPILER=/usr/bin/gcc-5 -D CMAKE_CXX_COMPILER=/usr/bin/g++-5 -D CMAKE_CXX_FLAGS=-std=c++11 -D WITH_FFMPEG=OFF .. 即可執行編譯任務:

3.3 參數解釋

接下來介紹cmake命令行中的各個變量的含義,類似於-D選項,CMAKE_BUILD_TYPE這類OpenCV3.x編譯中也用到了的變量,都在 Ubuntu下安裝OpenCV(二): CMake編譯(上) 進行了詳細介紹,下面只針對新出現的4個變量進行解釋:

(1) CMAKE_C_COMPILER 

     CMAKE_CXX_COMPILER

這兩個變量都屬於變量CMAKE_<LANG>_COMPILER,<LANG>指的是編譯器的語言,C代表C語言,CXX代表C++。

在GNU/Linux系統下,C/C++編譯器本質上是名為gcc/g++的可執行程序,它們都存放在/usr/bin目錄下。變量CMAKE_<LANG>_COMPILER的參數就是<LANG>編譯器的完整路徑(https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html)

This is the command that will be used as the <LANG> compiler. Once set, you can not change this variable.

兩個變量的默認值分別為/usr/bin/gcc/usr/bin/g++,即gcc和g++編譯器的路徑,我們在這裡將參數設置為/usr/bin/gcc-5/usr/bin/g++-5,意味著將默認的編譯器修改為我們新安裝的5.5.0版本編譯器

(2) CMAKE_CXX_FLAGS

這個變量屬於CMAKE_<LANG>_FLAGS,它負責設置CMake的編譯選項。該變量的參數是一系列用空格分隔的字符片段(https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html)

This value is a command-line string fragment. Therefore, multiple options should be separated by spaces, and options with spaces should be quoted.

因為5.5.0版本的C++編譯器需要ISO C++ 2011標準的支持,所以我們需要為變量CMAKE_CXX_FLAGS手動添加參數-std=c++11或者-std=gnu++11。如果不添加這一參數的話,在下一步make編譯時會出現報錯:

有關ISO C++ 2011標準的更多內容可以見這篇博客:https://www.learncpp.com/cpp-tutorial/b-1-introduction-to-c11/

這個變量在CMakeLists.txt中的注釋為Include FFMPEG support,也就是包含FFMPEG支持,參數值默認為ON。但是,如果使用默認參數ON進行編譯,在下一步make編譯時會出現如下報錯:

這裡的報錯信息非常長,報錯原因是某些宏定義沒有被聲明。由於FFMPEG模塊在升級的過程中棄用了一些宏定義和函數,並更換了一些API的名稱,而OpenCV2.x中依舊使用的是舊的內容,所以會出現接口不對應這類錯誤。

具體的API變更記錄見官方日誌: https://github.com/FFmpeg/FFmpeg/blob/master/doc/APIchanges

個人認為解決此問題的方法是下載舊版的ffmpeg支持包,但是我在嘗試了之後依舊是編譯失敗 到現在我也沒找到解決這個問題的方法。

所以我只能通過給變量WITH_FFMPEG設置參數OFF來跳過"包含FFMPEG支持"這一步,也就是說,讓編譯器不再編譯有關FFMPEG模塊的內容,編譯過程也就不會出現報錯了。

不過這樣做只是跳過了報錯,並沒有解決問題,如果讀者朋友們有好的解決方法,記得留言告訴我

3.3 編譯結果

在編譯過程中,CMAke會輸出很多棄用警告(CMake Deprecation Warning),主要是由於某些舊的策略(Policies)已經被棄用而導致的(https://cmake.org/cmake/help/v3.21/manual/cmake-policies.7.html)

CMake警告不會中斷編譯過程,所以我們可以忽略掉這些棄用警告:

編譯完成後,可以在輸出中查看編譯信息匯總

編譯信息匯總

從上圖可以看到,C和C++編譯器都使用了我們之前下載的5.5.0版本,在C++ flags中也已經添加了對C++11的支持。

在匯總信息的最後可以看到"Configuring done","Generating done"和"Build files have been written to <build directory>"三條語句。這說明CMake這一步已經全部完成,編譯生成的文件已經被保存在了構建目錄下。

接下來的所有步驟和OpenCV3.x完全相同,如果想看詳細的步驟、命令解釋的話可以查看之前的文章。

第5步進行make編譯,在構建目錄下輸入sudo make或者sudo make -j*進行單線程或多線程編譯,*代表計算機可用線程數。

我的計算機可用線程數為8,所以輸入sudo make -j8進行編譯:

在計算機任意位置輸入cat /proc/cpuinfo | grep "processor" | wc -l 可以查看自己計算機的可用線程數:

在使用make命令進行編譯的過程中,我們也會看到很多警告信息,這些同樣都屬於棄用警告,可以再次忽略掉:

make編譯完成後,OpenCV項目的目標文件都已經生成,接下來需要將這些目標文件打包生成庫文件,並連同頭文件、可執行程序和一些文本文件/數據一起安裝在CMake編譯時我們通過變量CMAKE_INSTALL_PREFIX設置的路徑下。

在構建目錄下輸入sudo make install執行這一步:

sudo make install

這一步的執行速度會很快,從輸出內容中,我們還能看到項目的編譯模式為"Release",並清楚的看到各個文件的安裝過程:

等待執行完成之後,使用cd命令進入之前設置的安裝路徑下(我設置的是/usr/local/opencv-2-4-10-release),可以看到4個新生成的文件夾:

其中,bin文件夾用來存放可執行程序、include存放算法的頭文件、lib存放.pc文件和Release版本的庫文件、share會存放一些文本文件以及XML格式的數據。

接下來設置系統共享庫的路徑,在/etc/ld.so.conf.d/下輸入命令sudo touch <file name>新建一個指定名稱的文件,拓展名為.conf;之後使用命令sudo gedit <file name>在該文件中寫入OpenCV共享庫的路徑。

在這裡我將文件命名為opencv-2-4-10r.conf,在文件中寫入/usr/local/opencv-2-4-10-release/lib

在/etc/ld.so.conf.d/中還能看到我之前設置的不同版本、不同編譯模式的.conf文件,設置規範的文件名有助於文件的歸檔整理與查找

保存好文件之後,輸入sudo ldconfig命令更新系統動態庫的路徑緩存

第8步和第9步也很簡單,第8步先設置OpenCV2.4.10的頭文件和共享庫選項,進入/usr/lib/pkgconfig文件夾下,使用cp命令將opencv.pc文件複製到該目錄下,並為文件重命名。

opencv.pc被安裝在<install directory>/lib/pkgconfig下,這裡的<install directory>指的是我們在CMake編譯時通過變量CMAKE_INSTALL_PREFIX設置的路徑。


下圖中我將文件重命名為opencv-2-4-10r.pc,從圖中同樣能看到我之前複製粘貼過來的不同版本、不同編譯模式生成的.pc文件:

複製完成後,使用pkg-config命令驗證一下是否設置成功。在命令行中輸入pkg-config --modversion opencv-2-4-10rpkg-config --cflags opencv-2-4-10rpkg-config --libs opencv-2-4-10r,如果正確輸出了.pc文件的內容,則這一步完成。

第9步更加簡單,在計算機任意位置輸入命令sudo updatedb,進行系統文件名資料庫的更新

最後,用OpenCV自帶的樣例做一個測試,在OpenCV2.4.10源碼包下的samples/cpp文件夾中,挑選一個C++程序進行測試,我在這裡選擇的是squares.cpp,它實現了一個從圖片中尋找方框的算法。

在cpp文件夾下,輸入命令sudo g++ -o squares squares.cpp `pkg-config --cflags --libs opencv-2-4-10r`對原始碼進行編譯,並將生成的可執行程序命名為squares。之後輸入sudo ./squares運行該程序,如果成功出現圖片,則代表測試成功。


歷時一個半月,Ubuntu下安裝OpenCV系列終於完結了 如果從第一篇"OpenCV配置攻略"算起,已經過去四個月了。不過,整個OpenCV系列並沒有完結 我正在寫Windows下安裝OpenCV系列,計劃更新6-7篇,目前已經寫到了第3篇,希望春節前可以更新完吧 實在是寫不動了。

在我的待寫目錄中,還有2篇"基於Python的OCR實現",1篇"重裝Windows10攻略",1篇"Windows10下安裝Ubuntu雙系統攻略",以及2022年準備開始寫的長篇連載文"微信小程序全棧開發"系列(畫大餅),再加上我最近在做新的項目,估計後續還會有更多的內容可以寫,悄悄期待一下。

下一篇文大概率會是基於Python的OCR實現  應該會分成上下兩篇來發,主要內容是使用5種方法進行文字識別,目前我已經完成了其中的4種,快寫完啦

~END~

相關焦點

  • Ubuntu下安裝OpenCV(七): 4.x的安裝與配置
    本文以OpenCV4.5.3為例(未配置額外算法模塊contrib),在Ubuntu18.04下使用Release模式進行原始碼編譯。
  • 在Ubuntu中安裝OpenCV-Python | 三
    從預構建的二進位文件安裝OpenCV-Python僅用於編程和開發OpenCV應用程式時,此方法最有效。在終端(以root用戶身份)中使用以下命令安裝python-opencv:https://packages.ubuntu.com/trusty/python-opencv軟體包。
  • Ubuntu下編譯Opencv4.0及opencv_contribute模塊步驟詳解
    命令行輸入 sudo apt-get update 進行更新安裝cmake及依賴環境sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devsudo apt-get install python-dev python-numpy
  • VirtualBox虛擬機環境下配置Ubuntu系統,安裝Anaconda
    本文是什麼通過閱讀本文,您將在Windows平臺下載安裝VirtualBox虛擬機,在虛擬機內配置帶圖形界面GUI的Ubuntu Linux系統
  • Ubuntu安裝記錄
    我直接就留下了心裡陰影,因為那時候沒做備份,後來我備份的好習慣就是這麼被逼出來的🙃準備工作電腦配置先介紹下我的電腦配置吧。1234567產品名稱 : OMEN by HP Laptop 15-ce0xxBIOS : F.18-11/09/2018內存總量 : 16 GB處理器名稱 : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHzBIOS模式 : UEFI
  • Ubuntu20.04 的安裝與美化
    安裝ubuntu前,電腦基本配置是:WIN10;GeForce GTX 1650;i5-9300H CPU;15.6 GiB;512.1 GB SSD ;2 方式推薦跟著視頻一步步地進行操作,親測有效。視頻教程連結:https://www.bilibili.com/video/BV11k4y1k7Li?
  • Ubuntu系統的安裝與使用
    Ubuntu 系統安裝:進入BIOS設置USB (系統盤) 啟動, 安裝Ubuntu系統(斷網先不安裝第三方軟體,快速安裝Ubuntu)。2.顯卡驅動和CUDA:https://developer.nvidia.com/cuda-downloads選擇配置,利用proxychains下載並安裝驅動和CUDA
  • Linux學習2:Ubuntu軟體安裝
    /)下的snap目錄中;snap安裝包是Canonical公司發布的全新的軟體包管理方式,它類似一個容器擁有一個應用程式所有的文件和庫,各個應用程式之間完全獨立。所以使用snap包的好處就是它解決了應用程式之間的依賴問題,使應用程式之間更容易管理。但是佔用的磁碟空間也更多。snap應用可以安裝一個軟體的不同版本(比如一個安裝Python2.7,另一個安裝Python3.3)而不造成任何的幹擾。
  • caffe的安裝
    (記得重啟系統) cudnn的安裝:採用5.1版本,即是cudnn-8.0-win-x64-v5.1-prod.zip。 sudo apt-get install cmake-qt-gui  打開到下載了opencv-2.4.13.zip的目錄,建議安裝2.4.13在目錄下打開終端輸入: unzip opencv-2.4.13.zip cd opencv-2.4.13/ mkdir opencv-debug
  • 最新超詳細的Ubuntu20.04環境下安裝Moodle學習平臺
    之前文章提到Moodle在線學習平臺開源免費,可以獨立嘗試,可是最新版Linux(ubuntu)系統配置與過去略有不同,不少人搭建過程中出現了問題,這裡是最新超詳細的保姆級教程,共分為四部分:1.製作Ubuntu U盤引導盤 2.Ubuntu系統安裝 3.Moodle環境配置 4.Moodle安裝一 製作Ubuntu
  • OpenCV+VS環境配置一次,永久使用
    opencv主要配置include、lib 和附加項,VS與OpenCV 有對應的版本要求,但是我有用 VS2013 配過OpenCV3.3 也能配置成功,在後臺回復 VS-OpenCV 即可獲得 VS2013版本和 OpenCV3.0。
  • 在安卓手機上安裝Ubuntu詳細教程(無需root)
    有些版本的Termux.apk因為安裝過程中會因為手機沒有root權限的原因而安裝不出來,這個時候,建議大家直接從F-Droid中去下載和安裝Termux。詳細步驟參見本文第三章內容。二、安裝步驟:1、 下載Termux:圖1 F-Droid官網圖2 Termux下載2、 安裝Termux    Termux下載完成後選擇安裝(安裝過程中請選擇允許訪問存儲器)。
  • Ubuntu系統安裝(虛擬機版)
    -8QYGC-NPKYFYF390-0HF8P-M81RQ-2DXQE-M2UT6ZF71R-DMX85-08DQY-8YMNC-PPHV82.下載Ubuntu20.04LTS  ISO鏡像下載連結:https://ubuntu.com/download/desktop/thank-you?
  • 安裝Ubuntu 18 Server 系統
    所以這次寫一個Ubuntu server 系統的安裝教程。系統鏡像下載地址https://cn.ubuntu.com/download  ---> 下載Ubuntu伺服器版,選擇帶LTS的,LTS是長期支持版的!
  • Linux系統下編譯OpenCV
    Linux系統下要安裝OpenCV,需要自己下載源碼進行編譯,過程有些麻煩,很多地方也不理解為什麼要這麼做,只是單純記錄一下步驟。
  • LVI-SAM的安裝與測試
    他是一個基於ROS的功能包,因此我們首先需要配置好ros,並且官方在kinetic (ubuntu16.04)和 melodic(18.04)中已經測試過了,如果你是這兩版的ROS,根據以下指令直接安裝即可。
  • 2、安裝Ubuntu作業系統
    Ubuntu مەشخۇلات سېستىمىسىنى چۈشۈرۈشئورگان تورى: https://ubuntu.com/ئورگان تورنى ئېچىپ باش بەتتىن Get Ubuntu نى بېسىپ كېينكى بەتكە ئۆتىمىز.
  • 寫給工程師的 Ubuntu 20.04 最佳配置指南
    打造你的命令行工具(Terminator && ZSH)1. 安裝 Terminnator如果你用慣了 Mac 平臺下的 iTerm2,一定會對它的分屏功能戀戀不忘,然而 Ubuntu 自帶的 Terminal 並不好用。
  • OpenCV簡介及安裝
    2009年9月,OpenCV 1.2(beta2.0)發布。2009年10月1日,Version 2.0發布。2010年12月6日,OpenCV 2.2發布。2011年8月,OpenCV 2.3發布。2012年4月2日,發布OpenCV 2.4。2014年8月21日,發布OpenCv 3.0 alpha。
  • 最新版 Ubuntu Linux 手把手下載安裝教程 for Server
    選擇虛擬機類型虛擬機硬體兼容性選擇「Workstation 15.x」,然後選擇「下一步」繼續,如下圖所示。您可以提供一個存檔鏡像,而不是默認的「http://cn.archive.ubuntu.com/ubuntu」該地址是可以以後再進行修改的,所以這裡直接選擇「Done』執行下一步繼續,如下圖所示。