まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

OpenCVを使う

Swift+iOSOpenCVを使ってみます。
最初はcocoapodsをインストールしていたのですが、どうにもリンクエラーになってしまって
opencv2.frameworkを追加する以下のような方法でやることにしました。

1.こちらにアクセスし、
新しいバージョン(2015年6月の時点では3.0.0)をクリック、さらにopencv2.framework.zipをクリックし
ダウンロードする
2.プロジェクトファイルを作成し、プロジェクトファイルのLinked Fremeworks and Librariesに先ほど
ダウンロードし解凍したopencv2.frameworkをドラック&ドロップする
3.Fileメニュー→New→Fileを選択し、iOS-Source-Objective-C Fileを選ぶ。File typeはEmpty Fileにし、ファイル名を入力。
ここではTestOpenCVとします
4.ファイル名.mとプロジェクトファイル名-Bridging-Header.hができるので、ファイル名.mをファイル名.mmに書き換える
5.ファイル名.mmとプロジェクトファイル名-Bridging-Header.hにOpenCVのコードを書いていく
今回はこちらを参考にさせて頂いて、輪郭線を抽出するコードを書きます。

・プロジェクトファイル名-Bridging-Header.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface TestOpenCV : NSObject
+(UIImage *)DetectEdgeWithImage:(UIImage *)image;


@end

・ファイル名.mm

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import "openCVTest2-Bridging-Header.h"

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

@implementation TestOpenCV : NSObject

+(UIImage *)DetectEdgeWithImage:(UIImage *)image{
    
    //UIImageをcv::Matに変換
    cv::Mat mat;
    UIImageToMat(image, mat);
    
    //白黒濃淡画像に変換
    cv::Mat gray;
    cv::cvtColor(mat, gray, CV_BGR2GRAY);
    
    //エッジ検出
    cv::Mat edge;
    cv::Canny(gray, edge, 200, 180);
    
    //cv::MatをUIImageに変換
    UIImage *edgeImg = MatToUIImage(edge);
    
    return edgeImg;
}
@end

6.StoryboardにImageViewを設置し、画像を追加する
7.ViewControllerとImageeViewを結びつけ、以下のように入力する

import UIKit


class ViewController: UIViewController {

    @IBOutlet weak var cvTestPic: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
//ここから追加
        var image = cvTestPic.image
        var edge = TestOpenCV.DetectEdgeWithImage(image)
        cvTestPic.image = edge as UIImage;

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}