W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本教程介紹如何使用iPhone的攝像頭和OpenCV處理視頻幀。
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中即可:
此外,您必須找到用于項(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
首先,我們創(chuàng)建一個(gè)簡(jiǎn)單的iOS項(xiàng)目,例如單視圖應(yīng)用程序。然后,我們創(chuàng)建并添加UIImageView和UIButton來(lái)啟動(dòng)相機(jī)并顯示視頻幀。故事板可能是這樣的:
確保將IBOutlets和IBActions添加并連接到相應(yīng)的ViewController:
@interface ViewController : UIViewController
{
IBOutlet UIImageView* imageView;
IBOutlet UIButton* button;
}
- (IBAction)actionStart:(id)sender;
@end
我們將視頻控制器添加到攝像機(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)目中有以下框架:
我們遵循在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);
}
最后,我們必須告訴相機(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濾波器,在您的情況下可以方便使用。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: