iOS-OpenCV(一):iOS 上集成 OpenCV 庫(kù)

一、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 到工程有以下三種方式:
  1. 使用Cocopods進(jìn)行管理依賴(lài) pod ''OpenCV''
  2. 在官網(wǎng)OpenCV-iOS framework直接下載編譯好的庫(kù)
  3. GitHub 拉下源碼,編譯成framework陕赃,導(dǎo)入工程中

下面提前體驗(yàn)一下OpenCV的強(qiáng)大之處:
OpenCV官網(wǎng)提供的官方代碼

三卵蛉、構(gòu)建opencv + opencv_contrib的framework

此存儲(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è)步驟:

  1. 獲取OpenCV標(biāo)準(zhǔn)模塊的源代碼裙顽。將其存儲(chǔ)在任何文件夾中,我們將其稱(chēng)為<opencv_source_path>.
  2. 獲取OpenCV的額外模塊的源代碼喂分。將其存儲(chǔ)在任何文件夾中锦庸,我們將其稱(chēng)為<opencv_contrib_source_path>.
  3. 嘗試構(gòu)建所有模塊并將構(gòu)建存儲(chǔ)在任何文件夾中,我們將其稱(chēng)為<opencv_contrib_build_path>.
  4. 如果任何模塊未能構(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)該如下面的截圖所示:


image.png

附:

將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 barRequires full screen 復(fù)選框图毕,如下面的屏幕截圖所示:

image.png

狀態(tài)欄和全屏設(shè)置存儲(chǔ)在應(yīng)用程序的 Info.plist 文件中。打開(kāi)工程的 Info.plist眷唉,在編輯器區(qū)域中予颤,注意 UIRequiresFullscreenStatus 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”见坑。如下面的截圖所示:
image.png

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ī)值枕磁。如圖:

image.png

對(duì)于本工程,我們指定攝像機(jī)术吝,因?yàn)槲覀兿M褂矛F(xiàn)場(chǎng)視頻作為預(yù)覽计济。如果你有一個(gè)項(xiàng)目,你只關(guān)心捕捉靜止圖像排苍,你可以指定 still-camera 代替沦寂。
Required Device Capabilities參數(shù)配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淘衙,隨后出現(xiàn)的幾起案子传藏,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毯侦,死亡現(xiàn)場(chǎng)離奇詭異西壮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叫惊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)款青,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人霍狰,你說(shuō)我怎么就攤上這事抡草。” “怎么了蔗坯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵康震,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我宾濒,道長(zhǎng)腿短,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任绘梦,我火速辦了婚禮橘忱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卸奉。我一直安慰自己钝诚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布榄棵。 她就那樣靜靜地躺著凝颇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疹鳄。 梳的紋絲不亂的頭發(fā)上拧略,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音瘪弓,去河邊找鬼垫蛆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杠茬,可吹牛的內(nèi)容都是我干的月褥。 我是一名探鬼主播弛随,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓢喉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舀透?” 一聲冷哼從身側(cè)響起栓票,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后走贪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佛猛,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年坠狡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了继找。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逃沿,死狀恐怖婴渡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凯亮,我是刑警寧澤边臼,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站假消,受9級(jí)特大地震影響柠并,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜富拗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一臼予、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啃沪,春花似錦瘟栖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至签餐,卻和暖如春寓涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氯檐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工戒良, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冠摄。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓糯崎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親河泳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沃呢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容