OpenCV iOS - 視頻處理

這個(gè)章節(jié)解釋了使用iPhone的攝像頭和Opencv來進(jìn)行視頻處理。

預(yù)準(zhǔn)備

  • Xcode 4.3 或更高
  • iOS開發(fā)的基礎(chǔ)知識(shí)(Objective-C, Interface Builder)

導(dǎo)入Opencv庫(kù)到iOS工程

Opencv庫(kù)作為被調(diào)用的框架升薯,你可以直接拖拽到你的工程中岂却。從這里下載最新的庫(kù)重抖⊙鳎或者按照iOS安裝指南來編譯框架妄迁。一旦你有了framework卵渴,直接拖拽到Xcode:


你也需要找到工程中的預(yù)編譯文件。這個(gè)文件通常在"ProjectName/Supporting Files/ProjectName-Prefix.pch"罗售。在這你需要增加一個(gè)包含語句去導(dǎo)入Opencv庫(kù)辜窑。然而,確保你包含Opencv在包含UIKit和Foundation之前寨躁,因?yàn)槟惆l(fā)現(xiàn)像最大值和最小值的宏定義的被定義多次的編譯錯(cuò)誤。例如前綴可能如下所示:

//
// Prefix header for all source files of the 'VideoFilters' target in the 'VideoFilters' project
//

#import <Availability.h>

#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif

Example video frame processing project

User Interface

首先牙勘,我們創(chuàng)建一個(gè)簡(jiǎn)單的iOS工程职恳,例如Single View Application。然后方面,我們創(chuàng)建并且添加一個(gè)UIImageView和UIButton去啟動(dòng)攝像頭和顯示視頻幀放钦。故事版可以像這樣:



請(qǐng)務(wù)必將IBOutlets和 IBActions連接到相應(yīng)的ViewController。

@interface ViewController : UIViewController
{
    IBOutlet UIImageView* imageView;
    IBOutlet UIButton* button;
}

- (IBAction)actionStart:(id)sender;

@end

Adding the Camera

我們添加一個(gè)Camera控制器到一個(gè)頁(yè)面控制器并且在頁(yè)面被load時(shí)初始化:

#import <opencv2/highgui/cap_ios.h>
using namespace cv;

@interface ViewController : UIViewController
{
    ...
    CvVideoCamera* videoCamera;
}
...
@property (nonatomic, retain) CvVideoCamera* videoCamera;

@end
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
    self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
    self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
    self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
    self.videoCamera.defaultFPS = 30;
    self.videoCamera.grayscale = NO;
}

在這種情況下恭金,我們初始化相機(jī)并且把imageView作為渲染每幀的顯示操禀。CvVideoCamera是基于'AVFoundion'包裝的,所以我們能提供AVFoundation攝像頭選擇屬性横腿。例如我們想要使用前置攝像頭颓屑,設(shè)置視頻大小為352x288和視頻方向(攝像頭通常是橫向輸出,當(dāng)你做一個(gè)豎向的應(yīng)用時(shí)會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)位)

設(shè)置defaultFPS設(shè)置為攝像機(jī)的FPS耿焊, 如果處理少于預(yù)期的FPS揪惦,幀被自動(dòng)丟棄。

屬性grayscale=YES使用不同的顏色空間罗侯,即 “YUV (YpCbCr 4:2:0)”器腋,而grayscale=NO將輸出32位BGRA。

此外钩杰,我們必須手動(dòng)添加Opencv庫(kù)的依賴庫(kù)纫塌。最后,你在你的工程中至少有下面的框架:

  • opencv2
  • Accelerate
  • AssetsLibrary
  • AVFoundation
  • CoreGraphics
  • CoreImage
  • CoreMedia
  • CoreVideo
  • QuartzCore
  • UIKit
  • Foundation

Processing frames

我們遵循代理模式讲弄,這在iOS中十分普遍措左,提供訪問每個(gè)攝像幀的權(quán)限〈共牵基本上媳荒, 視圖控制器必須實(shí)現(xiàn)CvVideoCameraDelegate協(xié)議并且設(shè)置為視頻攝像頭的代理:

@interface ViewController : UIViewController<CvVideoCameraDelegate>
- (void)viewDidLoad
{
    ...
    self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
    self.videoCamera.delegate = self;
    ...
}
#pragma mark - Protocol CvVideoCameraDelegate

#ifdef __cplusplus
- (void)processImage:(Mat&)image;
{
    // Do some OpenCV stuff with the image
}
#endif

請(qǐng)注意我們?cè)谶@里使用了C++(cv::Mat)抗悍。重要提醒:你必須能重命名視圖控制器的后綴.m.mm,以便能在Objective-C++ (Objective-C與 C++ 混編)下編譯成功钳枕。 然后缴渊,當(dāng)編譯器處理C++代碼文件時(shí)__cplusplus被定義。因此__cplusplus在哪里被定義我們代碼就放在哪個(gè)代碼塊里鱼炒。

Basic video processing

從這你能開始處理視頻幀了衔沼。例如下面代碼片的圖片顏色翻轉(zhuǎn):

- (void)processImage:(Mat&)image;
{
    // Do some OpenCV stuff with the image
    Mat image_copy;
    cvtColor(image, image_copy, CV_BGRA2BGR);
    
    // invert image
    bitwise_not(image_copy, image_copy);
    cvtColor(image_copy, image, CV_BGR2BGRA);
}

開始

最后,我們必須告訴攝像機(jī)準(zhǔn)確的start/stop工作昔瞧。接下來的代碼當(dāng)你按下button時(shí)啟動(dòng)攝像頭指蚁,假設(shè)你正確的連接用戶界面:

#pragma mark - UI Actions

- (IBAction)actionStart:(id)sender;
{
    [self.videoCamera start];
}

Hints

盡可能的避免昂貴的矩陣復(fù)制操作,尤其你的目標(biāo)是實(shí)時(shí)處理自晰。如果可能凝化,盡可能的就地處理數(shù)據(jù)。
當(dāng)你工作在灰度數(shù)據(jù)時(shí)酬荞,一次設(shè)置grayscale = YES作為YUV顏色空間來讓你直接訪問亮度平面搓劫。

Accelerate框架提供了一些CPU加速的DSP濾波器,這可以讓你更得心應(yīng)手混巧。

原文地址:OpenCV iOS - Video Processing

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枪向,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咧党,更是在濱河造成了極大的恐慌秘蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傍衡,死亡現(xiàn)場(chǎng)離奇詭異深员,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)聪舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門辨液,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箱残,你說我怎么就攤上這事滔迈。” “怎么了被辑?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵燎悍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我盼理,道長(zhǎng)谈山,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任宏怔,我火速辦了婚禮奏路,結(jié)果婚禮上畴椰,老公的妹妹穿的比我還像新娘。我一直安慰自己鸽粉,他們只是感情好斜脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著触机,像睡著了一般帚戳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡首,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天片任,我揣著相機(jī)與錄音,去河邊找鬼蔬胯。 笑死对供,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氛濒。 我是一名探鬼主播犁钟,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泼橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迈勋,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤炬灭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后靡菇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重归,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年厦凤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼻吮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡较鼓,死狀恐怖椎木,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情博烂,我是刑警寧澤香椎,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站禽篱,受9級(jí)特大地震影響畜伐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躺率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一玛界、第九天 我趴在偏房一處隱蔽的房頂上張望万矾。 院中可真熱鬧,春花似錦慎框、人聲如沸良狈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽们颜。三九已至,卻和暖如春猎醇,著一層夾襖步出監(jiān)牢的瞬間窥突,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工硫嘶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阻问,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓沦疾,卻偏偏與公主長(zhǎng)得像称近,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哮塞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議刨秆。它實(shí)...
    香橙柚子閱讀 23,848評(píng)論 8 183
  • 親子日記第16篇 今天大寶放學(xué)回來跟我說他又摔倒了,原來的腿傷加重忆畅,作為母親我的心都要碎了衡未,恨不得代替他的疼痛! ...
    兩寶的媽咪閱讀 161評(píng)論 1 0
  • 記憶在慢慢消褪家凯, 能長(zhǎng)存的還有誰缓醋。 斷壁垣頹, 瓦礫上滴答的雨水绊诲, 能否伴風(fēng)隨送粱。 黑云下垂, 天神不再沉睡掂之, 雷聲...
    留白一許閱讀 251評(píng)論 0 2
  • 今早起床看書板惑,書中有這么一句話: 錢心跟著人心走橄镜。全世界最聰明的人最終都是先研究人心和制度,反過來才能駕馭金錢冯乘。 ...
    小easy閱讀 214評(píng)論 2 2
  • 歲月如梭 四季更迭 人生的腳步 總是太匆匆 走在生活的路上 我們孜孜不倦地 去探索生命的真諦 思考人生的意義 追求...
    一泓夜雨閱讀 245評(píng)論 3 3