W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
本教程介紹如何使用iPhone的攝像頭和OpenCV處理視頻幀。
OpenCV庫作為一個所謂的框架,可以直接拖放到您的XCode項目中。從http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/下載最新的二進制文件。或者按照本指南安裝在iOS中手動編譯框架。一旦有了框架,只需將其拖放到XCode中即可:
此外,您必須找到用于項目中所有頭文件的前綴標題。該文件通常位于“ProjectName / Supporting Files / ProjectName-Prefix.pch”。在那里,您添加了一個include語句來導入opencv庫。但是,在包含UIKit和Foundation之前,請確保包含opencv,因為否則您會收到一些奇怪的編譯錯誤,一些宏如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)建一個簡單的iOS項目,例如單視圖應用程序。然后,我們創(chuàng)建并添加UIImageView和UIButton來啟動相機并顯示視頻幀。故事板可能是這樣的:
確保將IBOutlets和IBActions添加并連接到相應的ViewController:
@interface ViewController : UIViewController
{
IBOutlet UIImageView* imageView;
IBOutlet UIButton* button;
}
- (IBAction)actionStart:(id)sender;
@end
我們將視頻控制器添加到攝像機控制器,并在視圖加載時對其進行初始化:
#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;
}
在這種情況下,我們初始化相機并提供imageView作為渲染每個幀的目標。CvVideoCamera基本上是圍繞AVFoundation的包裝,所以我們將AVGoundation攝像機的一些選項作為屬性。例如,我們要使用前置攝像頭,將視頻尺寸設置為352x288和視頻方向(視頻攝像機通常以橫向模式輸出,當您設計肖像應用程序時會導致轉置的數據)。
屬性defaultFPS設置相機的FPS。如果處理速度比所需的FPS快,幀將自動丟棄。
屬性灰度= YES導致不同的顏色空間,即“YUV(YpCbCr 4:2:0)”,而灰度=否則將輸出32位BGRA。
另外,我們必須手動添加opencv框架的框架依賴關系。最后,您應該至少在您的項目中有以下框架:
我們遵循在iOS中非常常見的授權模式,以提供對每個相機框架的訪問?;旧希晥D控制器必須實現CvVideoCameraDelegate協議,并且必須設置為攝像機的委托:
@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
請注意,我們在這里使用C ++(cv :: Mat)。重要:您必須將視圖控制器的擴展名.m重命名為.mm,以便編譯器在Objective-C ++(Objective-C和C ++混合)的假設下編譯它。然后,當編譯器正在處理C ++代碼的文件時,__cplusplus被定義。因此,我們將代碼放在__cplusplus定義的塊中。
從這里你可以開始處理視頻幀。例如,以下代碼段顏色會反轉圖像:
- (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);
}
最后,我們必須告訴相機實際上開始/停止工作。假設您正確連接了UI,按下按鈕,以下代碼將啟動相機:
#pragma mark - UI Actions
- (IBAction)actionStart:(id)sender;
{
[self.videoCamera start];
}
盡量避免昂貴的矩陣復制操作,特別是如果您正在實時瞄準。當圖像數據作為參考傳遞時,如果可能,就可以就地工作。
當您使用灰度數據時,請將灰度設置為YES,因為YUV色彩空間可讓您直接訪問亮度平面。
Accelerate框架提供了一些CPU加速DSP濾波器,在您的情況下可以方便使用。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: