2016-05-24 8 views
5

Swift IOSプロジェクトで、SwiftをObjective Cに接続するためのブリッジヘッダーとObjective Cラッパー(Objective CをC++に接続する)を使用してopencvを統合しました。このメソッドを使用して、私はSwiftコードから単一の画像を渡し、C++ファイルでそれらを分析して戻します。IOS SwiftプロジェクトのOpenCVによるビデオ処理

I've seen that opencv provides CvVideoCamera object that can be integrated with an Objective C UIViewController.

しかし、私のUIViewControllerは、スウィフトに書かれているので、これは同様に可能である場合、私は不思議に思っていましたか?

答えて

15

これは自分自身で遊ぶ機会を得た後の私の最初の回答の更新です。はい、CvVideoCameraをSwiftで書かれたビューコントローラで使用することは可能です。あなたのアプリでカメラからのビデオを表示するためにそれを使用したいだけなら、それは本当に簡単です。ブリッジヘッダを介して

#import <opencv2/highgui/cap_ios.h>次に、あなたのビューコントローラで:

class ViewController: UIViewController, CvVideoCameraDelegate { 
... 
    var myCamera : CvVideoCamera! 
    override func viewDidLoad() { 
     ... 
     myCamera = CvVideoCamera(parentView: imageView) 
     myCamera.delegate = self 
     ... 
    } 
} 

ViewControllerは、実際にCvVideoCameraDelegateプロトコルに準拠することはできませんが、CvVideoCameraはデリゲートなしで動作しませんので、我々は、いずれかを実装せずにプロトコルを採用するViewControllerを宣言することでこの問題を回避しますその方法のコンパイラの警告が表示されますが、カメラからのビデオストリームが画像ビューに表示されます。

もちろん、CvVideoCameraDelegateの(唯一)processImage()メソッドを実装して、ビデオフレームを表示する前に処理することができます。 Swiftで実装できない理由は、C++タイプのMatを使用しているためです。

したがって、インスタンスをカメラの代理人として設定できるObjective-C++クラスを作成する必要があります。 Objective-C++クラスのprocessImage()メソッドはCvVideoCameraによって呼び出され、Swiftクラスのコードを呼び出します。いくつかのサンプルコードスニペットがあります。 OpenCVWrapper.hで :ラッパーの実装、OpenCVWrapper.mm(それは客観的なC++クラス、したがって.mm拡張子です)で

// Need this ifdef, so the C++ header won't confuse Swift 
#ifdef __cplusplus 
#import <opencv2/opencv.hpp> 
#endif 

// This is a forward declaration; we cannot include *-Swift.h in a header. 
@class ViewController; 

@interface CvVideoCameraWrapper : NSObject 
... 
-(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv; 
... 
@end 

#import <opencv2/highgui/cap_ios.h> 
using namespace cv; 
// Class extension to adopt the delegate protocol 
@interface CvVideoCameraWrapper() <CvVideoCameraDelegate> 
{ 
} 
@end 
@implementation CvVideoCameraWrapper 
{ 
    ViewController * viewController; 
    UIImageView * imageView; 
    CvVideoCamera * videoCamera; 
} 

-(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv 
{ 
    viewController = c; 
    imageView = iv; 

    videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView]; 
    // ... set up the camera 
    ... 
    videoCamera.delegate = self; 

    return self; 
} 
// This #ifdef ... #endif is not needed except in special situations 
#ifdef __cplusplus 
- (void)processImage:(Mat&)image 
{ 
    // Do some OpenCV stuff with the image 
    ... 
} 
#endif 
... 
@end 

次にあなたが橋渡しヘッダに#import "OpenCVWrapper.h"を入れ、スクロールビューコントローラは次のようになります。

class ViewController: UIViewController { 
... 
    var videoCameraWrapper : CvVideoCameraWrapper! 

    override func viewDidLoad() { 
     ... 
     self.videoCameraWrapper = CvVideoCameraWrapper(controller:self, andImageView:imageView) 
     ... 
    } 

前方参照についてはhttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.htmlを参照してください。 Swift/C++/Objective-C interopをサポートしています。 #ifdef __cplusplusextern "C"(必要な場合)に関するウェブ上の情報がたくさんあります。

processImage()デリゲートメソッドでは、いくつかのOpenCV APIと対話する必要があります。そのためには、ラッパーも作成する必要があります。他の場所の情報を見つけることができます。たとえば、Using OpenCV in Swift iOS

+0

何かかのエラーが発生しました。両方のファイルを提供できますか –

関連する問題