OpenCV iOS-視頻處理

2018-08-28 10:51 更新

本教程介紹如何使用iPhone的攝像頭和OpenCV處理視頻幀。

先決條件:

  • Xcode 4.3或更高版本
  • iOS編程基礎(chǔ)知識(shí)(Objective-C,Interface Builder)

在您的iOS項(xiàng)目中包含OpenCV庫(kù)

OpenCV庫(kù)作為一個(gè)所謂的框架,可以直接拖放到您的XCode項(xiàng)目中。從http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/下載最新的二進(jìn)制文件?;蛘甙凑毡局改?a href="http://m.hgci.cn/opencv/opencv-ezwg28yy.html" target="_blank">安裝在iOS中手動(dòng)編譯框架。一旦有了框架,只需將其拖放到XCode中即可:

OpenCV iOS-視頻處理

此外,您必須找到用于項(xiàng)目中所有頭文件的前綴標(biāo)題。該文件通常位于“ProjectName / Supporting Files / ProjectName-Prefix.pch”。在那里,您添加了一個(gè)include語(yǔ)句來(lái)導(dǎo)入opencv庫(kù)。但是,在包含UIKit和Foundation之前,請(qǐng)確保包含opencv,因?yàn)榉駝t您會(huì)收到一些奇怪的編譯錯(cuò)誤,一些宏如min和max被多次定義。例如,前綴頭可能如下所示:

//
// 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

示例視頻幀處理項(xiàng)目

用戶界面

首先,我們創(chuàng)建一個(gè)簡(jiǎn)單的iOS項(xiàng)目,例如單視圖應(yīng)用程序。然后,我們創(chuàng)建并添加UIImageView和UIButton來(lái)啟動(dòng)相機(jī)并顯示視頻幀。故事板可能是這樣的:

OpenCV iOS-視頻處理

確保將IBOutlets和IBActions添加并連接到相應(yīng)的ViewController:

@interface ViewController : UIViewController
{
    IBOutlet UIImageView* imageView;
    IBOutlet UIButton* button;
}
- (IBAction)actionStart:(id)sender;
@end

Adding the Camera

我們將視頻控制器添加到攝像機(jī)控制器,并在視圖加載時(shí)對(duì)其進(jìn)行初始化:

#import <opencv2/videoio/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作為渲染每個(gè)幀的目標(biāo)。CvVideoCamera基本上是圍繞AVFoundation的包裝,所以我們將AVGoundation攝像機(jī)的一些選項(xiàng)作為屬性。例如,我們要使用前置攝像頭,將視頻尺寸設(shè)置為352x288和視頻方向(視頻攝像機(jī)通常以橫向模式輸出,當(dāng)您設(shè)計(jì)肖像應(yīng)用程序時(shí)會(huì)導(dǎo)致轉(zhuǎn)置的數(shù)據(jù))。

屬性defaultFPS設(shè)置相機(jī)的FPS。如果處理速度比所需的FPS快,幀將自動(dòng)丟棄。

屬性灰度= YES導(dǎo)致不同的顏色空間,即“YUV(YpCbCr 4:2:0)”,而灰度=否則將輸出32位BGRA。

另外,我們必須手動(dòng)添加opencv框架的框架依賴關(guān)系。最后,您應(yīng)該至少在您的項(xiàng)目中有以下框架:

  • opencv2
  • 加速
  • AssetsLibrary
  • AVFoundation
  • CoreGraphics中
  • CoreImage
  • CoreMedia
  • corevideo的
  • QuartzCore
  • UIKit的
  • 基礎(chǔ)

OpenCV iOS-視頻處理

處理框架

我們遵循在iOS中非常常見(jiàn)的授權(quán)模式,以提供對(duì)每個(gè)相機(jī)框架的訪問(wèn)?;旧希晥D控制器必須實(shí)現(xiàn)CvVideoCameraDelegate協(xié)議,并且必須設(shè)置為攝像機(jī)的委托:

@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)。重要:您必須將視圖控制器的擴(kuò)展名.m重命名為.mm,以便編譯器在Objective-C ++(Objective-C和C ++混合)的假設(shè)下編譯它。然后,當(dāng)編譯器正在處理C ++代碼的文件時(shí),__cplusplus被定義。因此,我們將代碼放在__cplusplus定義的塊中。

基本視頻處理

從這里你可以開(kāi)始處理視頻幀。例如,以下代碼段顏色會(huì)反轉(zhuǎn)圖像:

- (void)processImage:(Mat&)image;
{
    // Do some OpenCV stuff with the image
    Mat image_copy;
    cvtColor(image, image_copy, COLOR_BGR2GRAY);
    // invert image
    bitwise_not(image_copy, image_copy);
    //Convert BGR to BGRA (three channel to four channel)
    Mat bgr;
    cvtColor(image_copy, bgr, COLOR_GRAY2BGR);
    cvtColor(bgr, image, COLOR_BGR2BGRA);
}

開(kāi)始!

最后,我們必須告訴相機(jī)實(shí)際上開(kāi)始/停止工作。假設(shè)您正確連接了UI,按下按鈕,以下代碼將啟動(dòng)相機(jī):

#pragma mark - UI Actions
- (IBAction)actionStart:(id)sender;
{
    [self.videoCamera start];
}

提示

盡量避免昂貴的矩陣復(fù)制操作,特別是如果您正在實(shí)時(shí)瞄準(zhǔn)。當(dāng)圖像數(shù)據(jù)作為參考傳遞時(shí),如果可能,就可以就地工作。

當(dāng)您使用灰度數(shù)據(jù)時(shí),請(qǐng)將灰度設(shè)置為YES,因?yàn)閅UV色彩空間可讓您直接訪問(wèn)亮度平面。

Accelerate框架提供了一些CPU加速DSP濾波器,在您的情況下可以方便使用。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)