LoginSignup
22
23

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-17

OpenCV for iOSを使ってiphoneのカメラから取得した映像をリアルタイム処理して表示します.

環境

  • iOS: v8.3
  • Xcode: 6.3.1
  • OpenCV for iOS: v2.4.9

OpenCV for iOSの導入

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

Xcodeを立ち上げ,Single View Appricationにてプロジェクトを新規作成,さきほど解凍したファイルをtargetのBuild 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で制御できるようになります.

22
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
23