これは自分自身で遊ぶ機会を得た後の私の最初の回答の更新です。はい、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 __cplusplus
とextern "C"
(必要な場合)に関するウェブ上の情報がたくさんあります。
processImage()
デリゲートメソッドでは、いくつかのOpenCV APIと対話する必要があります。そのためには、ラッパーも作成する必要があります。他の場所の情報を見つけることができます。たとえば、Using OpenCV in Swift iOS
何かかのエラーが発生しました。両方のファイルを提供できますか –