一、OpenCV 概述
- OpenCV(開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù):http://opencv.org)是一個(gè)開(kāi)源的bsd許可庫(kù)诱咏,包含數(shù)百種計(jì)算機(jī)視覺(jué)算法苔可。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類(lèi)構(gòu)成,同時(shí)提供了Python胰苏、Ruby硕蛹、MATLAB等語(yǔ)言的接口拼卵,可以運(yùn)行在Linux馏颂、Windows、Mac OS谭企、iOS和Android操作系統(tǒng)上倔毙。
二埃仪、在 iOS 上集成 OpenCV 庫(kù)
集成 OpenCV 到工程有以下三種方式:
- 使用Cocopods進(jìn)行管理依賴(lài) pod ''OpenCV''
- 在官網(wǎng)OpenCV-iOS framework直接下載編譯好的庫(kù)
- 從 GitHub 拉下源碼,編譯成framework陕赃,導(dǎo)入工程中
下面提前體驗(yàn)一下OpenCV的強(qiáng)大之處:
OpenCV官網(wǎng)提供的官方代碼
三卵蛉、構(gòu)建opencv + opencv_contrib的framework
- 標(biāo)準(zhǔn)模塊:opencv
- 額外的模塊:opencv_contrib
此存儲(chǔ)庫(kù)用于開(kāi)發(fā)所謂的“額外”模塊、貢獻(xiàn)功能么库。新模塊通常沒(méi)有穩(wěn)定的API傻丝,并且沒(méi)有經(jīng)過(guò)良好的測(cè)試。因此诉儒,它們不應(yīng)該作為官方OpenCV發(fā)行版的一部分發(fā)布葡缰,因?yàn)樵搸?kù)保持了二進(jìn)制兼容性,并試圖提供良好的性能和穩(wěn)定性忱反。因此泛释,所有新模塊都應(yīng)該單獨(dú)開(kāi)發(fā),并首先在opencv_contrib存儲(chǔ)庫(kù)中發(fā)布温算。稍后怜校,當(dāng)模塊成熟并流行起來(lái)時(shí),它被轉(zhuǎn)移到中央OpenCV存儲(chǔ)庫(kù)注竿,開(kāi)發(fā)團(tuán)隊(duì)為這個(gè)模塊提供生產(chǎn)質(zhì)量支持茄茁。
我們將嘗試獲取和構(gòu)建OpenCV的所有模塊。大致說(shuō)來(lái)巩割,這一進(jìn)程將包括以下四個(gè)步驟:
- 獲取OpenCV標(biāo)準(zhǔn)模塊的源代碼裙顽。將其存儲(chǔ)在任何文件夾中,我們將其稱(chēng)為<opencv_source_path>.
- 獲取OpenCV的額外模塊的源代碼喂分。將其存儲(chǔ)在任何文件夾中锦庸,我們將其稱(chēng)為<opencv_contrib_source_path>.
- 嘗試構(gòu)建所有模塊并將構(gòu)建存儲(chǔ)在任何文件夾中,我們將其稱(chēng)為<opencv_contrib_build_path>.
- 如果任何模塊未能構(gòu)建蒲祈,通過(guò)刪除模塊或修復(fù)其源代碼來(lái)解決問(wèn)題甘萧。然后萝嘁,嘗試再次構(gòu)建。
運(yùn)行以下命令下載標(biāo)準(zhǔn)模塊的源代碼:
$ git clone https://github.com/opencv/opencv.git <opencv_source_path>
$ git clone https://github.com/opencv/opencv_contrib.git <opencv_contrib_source_path>
OpenCV的源代碼附帶了針對(duì)各種平臺(tái)的構(gòu)建腳本扬卷。iOS構(gòu)建腳本使用兩個(gè)參數(shù)——構(gòu)建路徑和opencv_contrib源代碼路徑牙言。以以下方式運(yùn)行腳本:
$ ./<opencv_source_path>/platforms/ios/build_framework.py <opencv_contrib_build_path> --contrib <opencv_contrib_source_path>
- 讀取腳本的輸出,看看是否構(gòu)建任何模塊失敗怪得。請(qǐng)記住咱枉,opencv_contrib都包含了來(lái)自不同作者的實(shí)驗(yàn)?zāi)K,有些作者可能就iOS兼容性測(cè)試過(guò)他們的模塊徒恋。
- 如果我們不需要有問(wèn)題的模塊蚕断,我們可以簡(jiǎn)單地在/modules中刪除它的源子文件夾,然后重新運(yùn)行build_framework.py入挣。例如亿乳,為了避免構(gòu)建顯著性模塊,我們可以刪除/modules/saliency径筏。
當(dāng)build_framework.py工作正常葛假,它打印:
** INSTALL SUCCEEDED **
并創(chuàng)建了框架文件<opencv_contrib_build_path>/opencv2.framework滋恬。稍后聊训,我們將把這個(gè)框架添加到我們的iOS應(yīng)用程序項(xiàng)目中;我們將使用以下代碼導(dǎo)入它的頭文件恢氯,如:
#import <opencv2/xphoto.hpp>
- 使額外的模塊在我們的代碼中是可選的
由于額外的模塊不如標(biāo)準(zhǔn)模塊穩(wěn)定带斑,我們可能希望在代碼中讓它們成為可選的。通過(guò)將可選代碼封裝在預(yù)處理器條件中酿雪,我們可以很容易地禁用或重新啟用它以測(cè)試效果遏暴≈豆簦考慮下面的例子:
#ifdef WITH_OPENCV_CONTRIB
#import <opencv2/xphoto.hpp>
#endif
如果我們想使用opencv2_contrib指黎,我們就會(huì)編輯Xcode項(xiàng)目設(shè)置來(lái)添加帶有_opencv_contrib的預(yù)處理器定義。然后州丹,在前面的示例中醋安,是xphoto.hpp頭文件將被導(dǎo)入到我們的代碼中。創(chuàng)建預(yù)處理器定義的詳細(xì)步驟如下:
- 在Build Settings選項(xiàng)卡中
- 找到 Apple LLVM 9.0 - Preprocessing
- 編輯 Preprocessor Macros | Debug and Preprocessor Macros | Release墓毒,添加WITH_OPENCV_ CONTRIB文本吓揪。
設(shè)置應(yīng)該如下面的截圖所示:
附:
將OpenCV和OpenCV_Contrib編譯到了同一個(gè)Framework中(比較偷懶的方法)
- 復(fù)制opencv_contrib\modules下需要的模塊(文件夾)至opencv\modules中
- 編譯
四、配置工程
1. Info.plist配置
首先所计,讓我們配置我們的應(yīng)用程序在全屏模式下運(yùn)行柠辞,沒(méi)有狀態(tài)欄。在導(dǎo)航窗格頂部選擇項(xiàng)目文件≈麟剩現(xiàn)在叭首,選擇編輯器區(qū)域中的 General 選項(xiàng)卡习勤,這是XCODE窗口的中心部分。找到 Deployment Info 組焙格,并啟用 Hide status bar 和 Requires full screen 復(fù)選框图毕,如下面的屏幕截圖所示:
狀態(tài)欄和全屏設(shè)置存儲(chǔ)在應(yīng)用程序的 Info.plist 文件中。打開(kāi)工程的 Info.plist眷唉,在編輯器區(qū)域中予颤,注意 UIRequiresFullscreen 和 Status bar is initially hidden 最初是隱藏的屬性,它們都具有“YES”值冬阳。但是蛤虐,我們?nèi)匀恍枰砑恿硪粋€(gè)屬性來(lái)確保狀態(tài)欄不會(huì)出現(xiàn)。懸停在列表中的最后一個(gè)項(xiàng)目上肝陪,然后單擊“+”按鈕插入新屬性笆焰。輸入 View controller-based status bar appearance 作為屬性的鍵,并將其值設(shè)置為“NO”见坑。如下面的截圖所示:
2. 添加 frameworks
除了對(duì) opencv2.framework 的依賴(lài)嚷掠,還依賴(lài)于 iOS SDK 的以下標(biāo)準(zhǔn)框架:
Accelerate.framework
AssetsLibrary.framework
AVFoundation.framework
CoreGraphics.framework
CoreImage.framework
CoreMedia.framework
CoreVideo.framework
QuartzCore.framework
UIKit.framework
Foundation.framework
Photos.framework
Social.framework
將這些框架添加到 Build Phases | Link Binary With Libraries (項(xiàng)目設(shè)置部分)。
3. 指定相機(jī)要求
目前荞驴,在支持iOS 9的所有設(shè)備中都有攝像頭不皆。然而,也許在未來(lái)熊楼,一些iOS設(shè)備將缺少相機(jī)霹娄。為了覆蓋這種可能性并防止App Store將我們的應(yīng)用程序分發(fā)給不兼容的設(shè)備,我們應(yīng)該明確地指定需要攝像頭鲫骗。
打開(kāi) Info.plist犬耻,展開(kāi) Required device capabilities 項(xiàng),添加一個(gè)新的子項(xiàng)执泰,并輸入攝像機(jī)值枕磁。如圖:
對(duì)于本工程,我們指定攝像機(jī)术吝,因?yàn)槲覀兿M褂矛F(xiàn)場(chǎng)視頻作為預(yù)覽计济。如果你有一個(gè)項(xiàng)目,你只關(guān)心捕捉靜止圖像排苍,你可以指定 still-camera 代替沦寂。
Required Device Capabilities參數(shù)配置