OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
OpenCV iOS - 動画処理

前のチュートリアル: OpenCV iOS - 画像処理

原著者Eduard Feicho
互換性OpenCV >= 3.0

このチュートリアルでは、iPhoneのカメラとOpenCVを使って動画フレームを処理する方法を説明する。

前提条件:

  • Xcode 4.3 以上
  • iOSプログラミングの基礎知識(Objective-C、Interface Builder)

iOSプロジェクトへのOpenCVライブラリの組み込み

OpenCVライブラリは、いわゆるフレームワークとして提供されており、XCodeプロジェクトに直接ドラッグ&ドロップできる。最新のバイナリを http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/ からダウンロードする。あるいは、このガイド iOSへのインストール に従ってフレームワークを手動でビルドしてもよい。フレームワークを入手したら、XCodeにドラッグ&ドロップするだけでよい:

また、プロジェクト内のすべてのヘッダファイルに使われるプレフィックスヘッダを見つける必要がある。このファイルは通常 "ProjectName/Supporting Files/ProjectName-Prefix.pch" にある。そこに、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

ビデオフレーム処理プロジェクトの例

ユーザーインターフェイス

まず、シンプルなiOSプロジェクト(例えば Single View Application)を作成する。次に、カメラを起動して動画フレームを表示するための UIImageView と UIButton を作成して追加する。ストーリーボードは次のようになる:

対応する ViewController に IBOutlet と IBAction を追加して接続すること:

@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 のラッパーであるため、AVFoundation のカメラオプションの一部をプロパティとして指定する。例えば、フロントカメラを使用し、動画サイズを 352x288 に設定し、動画の向き(ビデオカメラは通常ランドスケープモードで出力するため、ポートレートアプリを設計する際にはデータが転置される)を指定する。

プロパティ defaultFPS はカメラのFPSを設定する。処理が目標のFPSより遅い場合、フレームは自動的に破棄される。

プロパティ grayscale=YES では別の色空間、すなわち "YUV (YpCbCr 4:2:0)" になり、grayscale=NO では 32 ビットの BGRA を出力する。

さらに、opencv フレームワークのフレームワーク依存関係を手動で追加する必要がある。最終的に、プロジェクトには少なくとも次のフレームワークが含まれているはずである:

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

フレームの処理

各カメラフレームへのアクセスを提供するために、iOSで非常に一般的なデリゲーションパターンに従う。基本的に、ビューコントローラは 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];
}

ヒント

特にリアルタイム処理を目指す場合は、コストの高い行列のコピー操作をできる限り避けること。画像データは参照として渡されるため、可能であればインプレースで処理すること。

グレースケールデータを扱う場合は grayscale = YES に設定すること。YUV色空間では輝度プレーンに直接アクセスできるためである。

Accelerate フレームワークは、CPUアクセラレーションによるいくつかのDSPフィルタを提供しており、この用途に便利である。