2015年7月15日水曜日

objective-cでOpenCVを使う その2

  • 公開日:2015年07月14日

記事概要


objective-cでOpenCVの使い方を学習します。
その1に続きです。

開発環境

  • Xcode 6.4
  • Swift 1.2

難易度


★★★★☆(中級)

opencvのダウンロード


http://opencv.org/downloads.html OpenCV for iOSをダウンロードします。

ダウンロードしたopencv2.frameworkをプロジェクトから参照します。

プロジェクトフォルダ → TARGETS[opencv-obj-c] → Build Phaseを選択します。

Link Binary With Librariesの+を押し、add otherボタンからフレームワークを追加します。

OpenCVの実装


ViewController.mをViewController.mmに変更します。これによりC++が利用可能になります。
opencv の c++ ライブラリを使うための対策です。

[UIImageToMat]と[MatToUIImage]を使用するため、ライブラリをインポートします。
[UIImageToMat]はUIImage を cv::Mat に変換します。
[MatToUIImage]はcv::Mat を UIImage に変換します。
このパターンがopencvの基本的な使い方になります。

サンプルとしてグレースケールの実装を行ないます。

【objective-c/ViewController.mm】

#import "ViewController.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIImage* sampleImg = [UIImage imageNamed:@"sample"];
    self.imageview.image = sampleImg;
    
    // 元画像データを保存
    self.originalimageview = [UIImage imageWithCGImage:[self.imageview CGImage]];
    
    // 初期はNO
    self.imageswitch.on = NO;
    
    [self.imageswitch addTarget:self action:@selector(switchBtn:) forControlEvents:UIControlEventValueChanged];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)switchBtn:(id)sender
{
    NSLog(@"pushed");
    UISwitch *sw = sender;
    if (sw.on) {
        // グレースケール変換
        UIImage *edge = [self getEdgeImg:self.imageview.image];
        self.imageview.image = edge;
        //NSLog(@"スイッチがONになりました.");
    } else {
        self.imageview.image = self.originalimageview.image;
        //NSLog(@"スイッチがOFFになりました.");
    }
    
}

- (UIImage *)getEdgeImg:(UIImage *) img{
    
    // UIImage を cv::Mat に変換
    cv::Mat mat;
    UIImageToMat(img, mat);
    
    // グレイスケール変換
    cv::Mat gray;
    cv::cvtColor(mat, gray, CV_BGR2GRAY);
    
    // 画像のエッジを検出
    cv::Mat edge;
    cv::Canny(gray, edge, 200, 100);
    
    UIImage *edgeImg = MatToUIImage(edge);
    
    return edgeImg;
}

@end


ビルドし、アプリを立ち上げてみましょう。

SwitchがOFFの状態

SwitchがONの状態

OpenCVが実装できていますね。

以上です。

Objective-cでのiphoneアプリ開発にオススメの本


iphone開発の経験があり、より優れた設計のiphoneアプリを作りたい人向けの本です。
iphoneプログラミングをパーツ化するテクニックを学べます。アプリを量産したい人には必須の本です。

OpenCvでの開発にオススメの本


OpenCVはこの本一択です。長く利用できるコストパフィーマンスに優れた良書です。
あとは公式サイト(とgoogle検索と試行錯誤)で大丈夫です。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...