見出し画像

OpenCV入門 (4) - iOSでの利用

iOSでOpenCVを利用する方法を説明します。

・OpenCV 4.1.1
・Xcode 10.3
・Swift 4.5

前回

1. OpenCVフレームワークのダウンロード

以下のサイトの「OpenCV - 4.1.1」の「iOS pack」をクリックします。解凍すると、「onepcv2.framework」が取得できます。

OpenCV - Releases

2. Xcodeプロジェクトの作成

Xcodeプロジェクトを作成して、「onepcv2.framework」をリンクします。

(1)Xcodeで新規プロジェクトを作成。

(2)「TARGET」の「Linked Frameworkds and Libraries」に「opencv2.framework」を追加。

画像1

3. OpenCV-Swift間のブリッジの作成

「Swift」から「OpenCV」を利用するには、「Objective-C」でブリッジを作成する必要があります。

(1)メニュー「File → New → File」の「Object C File」でObject-Cファイルを作成。

・FIle: OpenCVManager
・FileType: Empty File
・Class: NSObject

Object-Cファイル「OpenCVManager.m」が生成されます。

(2)Object-Cファイル作成時に、「Bridging-Header.h」を作成するかどうかの聞かれるので「Create Bridging Header」をクリック。

画像2

「<プロジェクト名>-Bridging-Header.h」が生成され、「Build Setting」の「Objective-C Bridging Header」にもこのファイル名が追加されます。

画像3

(3)「OpenCVManager.h」を追加し、「OpenCVManager.m」を「OpenCVManager.mm」に変更。
C++を使うときは拡張子を「mm」にします。

(4)ソースコードを次のように編集。
OpenCVを使って、RGBをGrayに変換するメソッドrgb2gray()を追加しています。

【<プロジェクト名>-Bridging-Header.h】

#import "OpenCVManager.h"

【OpenCVManager.h】

#import <UIKit/UIKit.h>

//OpenCVマネージャ
@interface OpenCVManager : NSObject
+ (UIImage*)rgb2gray:(UIImage*)image;
@end

【OpenCVManager.mm】

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

//OpenCVマネージャ
@implementation OpenCVManager

//RGB→Gray
+ (UIImage*)rgb2gray:(UIImage*)image {
   cv::Mat img_Mat;
   UIImageToMat(image, img_Mat);
   cv::cvtColor(img_Mat, img_Mat, cv::COLOR_BGR2GRAY);
   return MatToUIImage(img_Mat);
}
@end

OpenCVのヘッダファイルを他のヘッダファイルより先に記述しないと、「Expected identifier」のエラーがでるので、注意してください。

XCode + OpenCV3.xで、Expected Identifierエラーが出る場合の対処方法

4. OpenCVの動作確認

OpenCVの動作確認として、グレースケール変換を行います。

(1) Xcodeプロジェクトに「sample.jpg」を追加。

画像4

(2)ストーリーボードにImageViewを追加。
(3)「ViewController.swift」を次のように編集。
StoryboardのImageViewとIBOutletの関連づけも行います。

import UIKit

//ViewController
class ViewController: UIViewController {
   @IBOutlet var imageView : UIImageView!

   //ロード時に呼ばれる
   override func viewDidLoad()  {
       //RGB→Gray
       let image =  UIImage.init(named: "sample.jpg")
       self.imageView.image = OpenCVManager.rgb2gray(image)
   }
}

(4) 実行。
成功すると、次のようにグレースケールで表示されます。

画像5

次回


この記事が気に入ったらサポートをしてみませんか?