2017年10月23日月曜日

SwiftでOpenCV...の準備

iOSでOpenCVを動かしてみようと思いましたが結構難航してます。
cocoapodsでパッケージを取得する方法が簡単そうだったのですが一部のファイルが入らないようで諦めました。

iOS packをプロジェクトに手動で追加する方法でビルドと(emulatorでの)OpenCVのversion表示ができたのでここまでを記載してみます

1. 以下からiOS packをダウンロードする
 https://opencv.org/releases.html
2. 解凍してできたフォルダ"opencv2.framework"をフォルダごとworkspaceにドラッグ&ドロップする。ダイアログが表示されたら”Copy items if needed”をチェックする ( workspace に”opencv2.framework”が配置され、最初は×が表示されているがその後に消える)
3. C++を書くために、File -> New -> File -> “Cocoa Touch Class”を選択。言語はObjective-Cとする (名前は”OpenCvWrapper”などとしておく...以下はOpenCvWrapperとした時の例です)
4. dialogがpop upして、objective-Cのbridge wrapperを作るか聞かれるので”Create Bridge Header”を選択する
5. bridge header “*.m”が生成されるが、*.mmにファイル名を変更する (objective-Cのheaderはこうなのか??)
6. OpenCvWrappter.hを以下に変更
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface OpenCvWrapper : NSObject

// funciton to get opencv version
+(NSString * ) openCVVersionString;

@end

7. プロジェクト名-bridging-header.hを以下に変更
#import "OpenCVWrapper.h"       // 追加

8. OpenCvWrappter.mmにC++のコードを書く (下記はversionを表示するwrapperのコード)
// 本ファイルはOpenCvWrappter.m だったので、OpenCvWrappter.mm にファイル名を変更した   
// 本ファイルはOpenCvWrappter.m だったので、OpenCvWrappter.m にファイル名を変更した。"Expected identifier"が出る場合(NOのenum関連)、importの順序を以下の順にする(逆で発生していた。opencv2のheaderの読み込みを標準のheaderより前に持ってくる事で解消)
#import <opencv2/opencv.hpp>        // 追加
#import "OpenCvWrapper.h"

@implementation OpenCvWrapper

// 追加関数 ()
+(NSString *) openCVVersionString
{
    return [NSString stringWithFormat: @"openCV Version %s", CV_VERSION];
}

@end

9. Swift側にコードを記載する (以下は、labelにversionを表示する場合。UIはlabelの配置のみ)
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        // versionを表示してみる
        versionLabel.text = OpenCvWrapper.openCVVersionString() // wrapper関数の呼び出し
    }

ちょっとややこしいが
- **bridge-header.h : 本ファイルでimportしているheader fileに描かれているクラスなどをswift側から使用することができる
- **.h : **.mm (C++ソースファイル)のheaderファイル。
- **.mm : C++ソースファイル。ビルド時に”Expected identifier”が表示される場合はsystemとOpenCVのimportの順を逆にしてみる(OpenCVを先、systemを後にすると回避できた)

こちらのページを参考にさせていただきました
https://blog.fenrir-inc.com/jp/2017/04/opencv-3-2-in-a-swift-project.html
http://o-tyazuke.hatenablog.com/entry/2016/11/27/164908


0 件のコメント:

コメントを投稿