まず、簡単な背景:私はiOSにかなり慣れておらず、iOSデバイスでOpenCVを使用して顔を検出しようとしています。ここのサンプルコードを使用して、iOSopenCVサンプルコードを正常に動作させることができました。
これにより、カメラからポーリングされたフレームごとに呼び出される便利なメソッドが作成されます。
- (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」をグローバルにする方法はありますか?もしそうなら、私はそれをどのように行うのでしょうか、そしてこれはそれを行う正しい方法ですか?
ご協力いただきありがとうございます!