0

まず、簡単な背景:私はiOSにかなり慣れておらず、iOSデバイスでOpenCVを使用して顔を検出しようとしています。ここのサンプルコードを使用して、iOSopenCVサンプルコードを正常に動作させることができました。

http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing

これにより、カメラからポーリングされたフレームごとに呼び出される便利なメソッドが作成されます。

- (void)processImage:(Mat&)image;
{
    // Do some OpenCV stuff with the image
    Mat image_copy;
    cvtColor(image, image_copy, CV_BGRA2BGR);

    // invert image
    bitwise_not(image_copy, image_copy);
    cvtColor(image_copy, image, CV_BGR2BGRA);
}

この例では、カメラからのフレームが正常に反転され、デバイスに表示されます。これは、フレームで実行したい画像処理の代わりに、獲得したOpenCVC++コードをここに置き換えることができるので便利です。

さて、顔追跡を実装したいと思います。OpenCV 2.4.2以降には、「opencv2 / contrib/detection_based_tracker.hpp」と呼ばれる検出ベースのトラッカーのヘッダーファイルがあります。これは、DetectionBasedTrackerと呼ばれるクラスを定義します。それが定義する追跡メカニズムは、バックグラウンドでhaarカスケードを使用してオブジェクトを検出します。フレームごとの顔検出ではなく、この時間追跡方法を使用したい理由は、追跡がOpenCVHaarの実装よりもはるかに高速であるためです。それを実装する方法のガイドはここに示されています:http: //bytesandlogics.wordpress.com/2012/08/23/detectionbasedtracker-opencv-implementation/

このコードをAndroidデバイスのCで実装することに成功しました。主なコードは次のとおりです。

DetectionBasedTracker::Parameters param;
param.maxObjectSize = 400;
param.maxTrackLifetime = 20;
param.minDetectionPeriod = 7;
param.minNeighbors = 3;
param.minObjectSize = 20;
param.scaleFactor = 1.1;

// The object needs to be defined using the constructor with the above 
// declared parameter structure. Then the object.run() method is called 
// to initialize the tracking.
DetectionBasedTracker obj = DetectionBasedTracker("haarcascade_frontalface_alt.xml",param);
obj.run();

したがって、フレームごとに、次の行を使用して面のバウンディングボックスを検出するように処理できます。

obj.process(gray_frame);
vector< Rect_<int> > faces;
obj.getObjects(faces);

さて、問題。Objective Cで、「DetectionBasedTracker obj」オブジェクトを作成して、「-(void)processImage:(Mat&)image;」で使用できるようにする方法 方法?何がprocessImageメソッドを呼び出すのかわからないので、そのように渡すことができるかどうかはわかりません。「DetectionBasedTrackerobj」をグローバルにする方法はありますか?もしそうなら、私はそれをどのように行うのでしょうか、そしてこれはそれを行う正しい方法ですか?

ご協力いただきありがとうございます!

4

1 に答える 1

0

ビューコントローラの実装はobjective-c++(最初のリンクにそのように記載されています)であり、コンパイラとしてApple LLVM 2.0以降を使用する場合は、obj-c ++実装ファイル(拡張子.mm)のどこでもc++コードを使用できます。 。C ++ヘッダーをインポートし、次のようにインターフェイスファイルではなく、クラス全体のすべての変数を宣言します。

#import "ViewController.h"
#import "DetectionBasedTracker.h"


//class extension in your implementation file where your c++ variables go
@interface ViewController()
{
    DetectionBasedTracker myTracker();
}
@end

@implementation ViewController 

#pragma mark - Protocol CvVideoCameraDelegate

- (void)processImage:(Mat&)image;
{
    //...
    myTracker.doSomething();
    //...
}


@end
于 2013-03-15T12:01:50.660 に答える