1. 程式人生 > >1.2 準備OpenCV fremwork庫

1.2 準備OpenCV fremwork庫

文章目錄


官網上釋出了iOS framework庫檔案,它是一個包含庫標頭檔案和用於靜態連結的二進位制檔案的包。二進位制檔案支援所有iOS裝置體系結構(ARMv7、ARMv7s和ARM64)和所有iOS模擬器體系結構(x86和x64)。因此,我們可以對iOS應用程式專案的所有配置使用相同的框架檔案。
OpenCV 3被設計成模組化的。它的構建過程是高度可配置的,允許在不破壞其他模組的情況下新增、重新實現或刪除模組。每個模組由一個公共標頭檔案以及各種私有標頭檔案和實現檔案組成。一些模組被認為是OpenCV構建的標準組件,這些標準模組由庫的核心開發團隊維護和測試。其他模組被認為是額外的,這些額外的或“貢獻的”模組由第三方貢獻者維護和測試。這些額外的模組統稱為opencv_contrib。
如果我們僅僅是使用標準模組,就可以獲得OpenCV for iOS的正式預構建發行版。這個預構建發行版由一個framework檔案組成,opencv2.framework。如果我們想使用額外的模組,我們必須自己為自己構建opencv.framework.接下來,讓我們檢查獲取或構建框架的步驟。

[對於本書的專案,額外模組並不是必要的,但是推薦使用它們,因為我們將使用它們來實現一些可選特性。]

1.2.1 獲取預構建標準模組framework

前往https://opencv.org/releases.html並且點選對應版本的iOS pack來下載OpenCV for iOS.如果我們需要OpenCV 3.1 或者更新的版本.下載的檔名為opencv2.framework.zip.解壓之後得到opencv2.framework檔案.之後,我們將新增這個framework到我們的iOS應用程式.我們用以下程式碼匯入該庫的標頭檔案:
#import <opencv2/core.hpp>


這樣是從opencv2.framework匯入了核心模組的標頭檔案.如果要匯入其它的模組,匯入的申明語句將會不同.

1.2.2 用原始檔中構建標準模組和附加模組的framework

我們嘗試獲取並編譯所有的OpenCV模組,概括地說,這個過程將包含以下四個步驟:

  1. 獲取OpenCV標準模組的原始碼。將此儲存在任何資料夾中,我們將之稱為<opencv_source_path>,eg: /Users/<User>/Downloads/Work/opencv_source_path
  2. 獲取OpenCV的額外模組的原始碼。將其儲存在任何資料夾中,我們將其稱為<opencv_contrib_source_path>,eg:
    /Users/<User>/Downloads/Work/opencv_contrib_source_path
  3. 嘗試構建所有模組並將構建結果儲存在任何資料夾中,我們將其稱為<opencv_contrib_build_path>,eg:
    /Users/<User>/Downloads/Work/build
  4. 如果有模組無法構建,則通過刪除模組或修補其原始碼來解決問題。然後,嘗試重建。

現在,讓我們按照上述的步驟,討論下每一步的具體操作.為了獲得OpenCV的最新原始碼,我們可以使用Git,一個開源版本控制工具。我們在安裝Xcode命令列工具時,就已經安裝了Git.OpenCV的標準模組和額外模組分別託管在GitHub(線上倉庫託管伺服器)上的兩個倉庫中。要將標準模組的原始碼下載到<opencv_source_path>,請執行以下命令:
$ git clone https://github.com/opencv/opencv.git <opencv_source_path>
類似地,要將額外模組的原始碼下載到<opencv_contrib_source_path>,請執行以下命令:
git cone https://github.com/opencv/opencv_contrib.git <opencv_contrib_source_path>
(這樣下載的是倉庫中當前的最新OpenCV的程式碼,小編覺得還是去https://github.com/opencv/opencv_contrib/releaseshttps://github.com/opencv/opencv/releases下載指定釋出版本的程式碼比較好,小編自己用的是都是4.0.0版本的)

[Git更多的資料,請參閱Scott Chacon和Ben Straub的《Pro Git,第二版》(Apress,2014)。免費電子書版本可在https://www.git-scm.com/book獲取]

OpenCV的原始碼中附帶了為各個平臺準備的編譯指令碼.iOS編譯指令碼有兩個引數,構建結果的存放路徑和opencv_contrib的原始碼路徑.用以下的方式執行這個指令碼:
$ <opencv_source_path>/platforms/ios/build_framework.py <opencv_contrib_build_path> --contrib <opencv_contrib_source_path>
閱讀指令碼的輸出來觀察是否有模組編譯失敗.因為opencv_contrib包含了不同作者的試驗模組,並且有的作者或許沒有很好地測試他們的模組的iOS相容性.比如,下面的輸出表示在’saliency’模組中有相容性的錯誤(modules/saliency):
輸出
如果我們並不需要這個有問題的模組,我們只要簡單地在<opencv_contrib_source_path>/modules中移除掉相關的子資料夾,然後重新執行build_framework.py就好了.比如,為了避免構建’saliency’模組,我們刪除掉整個資料夾<opencv_contrib_source_path>/modules/saliency.

[對於這本書的專案來說,以下兩個模組是有用的:
· xfeatures2d:這個模組提供了額外的演算法來匹配圖片的特定細節資訊
· xphoto:這個模組提供了額外的圖片處理技術]

另一方面,如果我們確實需要這個有問題的模組,那麼首先必須有人修改原始碼,以便它能夠在iOS平臺上順利編譯和執行.修改open_contrib中的原始碼已經超出了本書的範圍,但是如果你對c++ 程式設計很精通,我鼓勵你抽空嘗試一下.或者,你可以在https://github.com/opencv/opencv_contrib/issues中提出一個問題,然後等待模組作者的迴應.
如果build_framework.py正常工作,將會列印
**INSTALL SUCCEEDED**
並且在<opencv_contrib_build_path>中建立opencv2.framework檔案.之後來我們將新增該framework到我們的iOS應用程式中去.我們用以下的方式匯入標頭檔案:
#import <opencv2/xphoto.hpp>
這樣就從opencv2.framework中匯入了xphoto模組的標頭檔案.匯入語句將根據模組的名稱而變化。

1.2.3 在我們的程式碼中設定附加模組為可選

因為附加模組不如標準模組那麼穩定,我們可能想讓附加模組在我們的程式碼中是可選的.將可選的程式碼放在條件編譯預巨集中,我們可以很容易地切換啟用或者停用他們來測試效果.參考以下程式碼:

#ifdef WITH_OPENCV_CONTRIB
#import <opencv2/xphoto.hpp>
#endif

如果我們想要使用opencv2_contrib,我們只要在Xcode的專案設定裡新增WITH_OPENCV_CONTRIB巨集.這樣,在前面的例子中,xphoto.hpp標頭檔案就會匯入到我們的程式碼中.詳細的建立條件編譯巨集將在本章後面的配置工程這一節中介紹.

###返回上一層###