OpenCVを使う
Swift+iOSでOpenCVを使ってみます。
最初は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. } }