OpenCV for iOSを使ってiphoneのカメラから取得した映像をリアルタイム処理して表示します.
なんで今更こんな話かというと,ここひと月で方々から聞かれまくったからです.

OpenCV for iOSの導入

今回のバージョン
- iOS: v8.3
- Xcode: 6.3.1
- OpenCV for iOS: v2.4.9

まずはOpenCV公式ホームページからOpenCV for iOSをダウンロードします.
解凍するとopencv2.frameworkが出てくるのでこれを利用します.

Xcodeを立ち上げ,Single View Appricationにてプロジェクトを新規作成,さきほど解凍したファイルをtargetBuild Phase内のLink Binary With Librariesに追加します.

その他,今回は

- QuartzCode.framework
- CoreImage.framework
- CoreMedia.framework
- CoreVideo.framework
- Accelerate.framework
- AssetsLibrary.framework
- AVFoundation.framework
- UIKit.framework
- Foundation.framework
- CoreGraphics.framework

といったフレームワークを使用するので,各々追加します.

これで,iOSデバイスカメラから取得した映像をopenCVで処理する下準備が整いました.

カメラ画像処理

ビューコントローラにカメラコントローラを追加し、ビューがロードされたときに初期化を行います.

ViewController.hにて以下を記述

//ViewController.h

#import <UIKit/UIKit.h>
#import <opencv2/highgui/ios.h>
#import <opencv2/opencv.hpp>
@interface ViewController : UIViewController<CvVideoCameraDelegate>
{
    CvVideoCamera* videoCamera;
    ...
}
...
@end

ViewController.mmにて以下を記述.

//ViewController.mm

- (void)viewDidLoad
{
    [super viewDidLoad];
    videoCamera = [[CvVideoCamera alloc]
                   initWithParentView:imageView];
    videoCamera.delegate = self;
    videoCamera.defaultAVCaptureDevicePosition =
    AVCaptureDevicePositionBack;
    videoCamera.defaultAVCaptureSessionPreset =
    AVCaptureSessionPreset352x288;
    videoCamera.defaultAVCaptureVideoOrientation =
    AVCaptureVideoOrientationPortrait;
    videoCamera.defaultFPS = 30;

    [videoCamera start];
}

以上の処理にて,使うカメラの種類(front/back),カメラ画像の向き,FPS,解像度等を指定します.
なお,今回はcv::Mat等c++の関数を利用するので拡張子を.mmに変更します.

最後の

[videoCamera start]

が呼ばれるとカメラが起動します.しかし,この状態では表示が横に回転している等,
不具合が生じている場合があります.これは,viewDidLoad関数が呼び出されたあとに,カメラの向き,解像度等の取得が行われるため,設定がうまくいっていないことによります.

今回は[videoCamera start]の代わりに

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startCamera:) userInfo:nil repeats:NO];


- (void)startCamera:(NSTimer *)timer
{
    [videoCamera start];
}

を記述し,呼び出すタイミングをずらしています.

あとはprocessImage関数内に,cvの処理を記載すればOKです.

今回のコードを利用し,特定の色以外をグレースケール化するコードをgithubにおきました(https://github.com/yukiB/extractColorOpenCV-IOS).

画面をタップすると,色抽出の閾値をsliderで制御できるようになります.


参考サイト: iOSからOpenCVを使った話(http://john-smith.hateblo.jp/entry/20140216/1392532903)
Share Button

OpenCV for iOS でリアルタイムカメラ画像処理

<2015/06/14>