openFrameworksで顔検出

Pocket
LINEで送る

かなり前に顔検出もやっていたので載せときます。

oF 0061で作ったときはかなり面倒だったけど、0070以降だとofxCvHaarFinderが使えるから
こんな感じにかなり楽にできます。

コードも載せておきます。

#define MOVIE_INPUT_WSIZE   320
#define MOVIE_INPUT_HSIZE   240
void testApp::setup(){
    // ビデオを取り込み初期化
    vidGrabber.initGrabber(MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
    // カラー画像とグレー画像の画像領域を確保
    colorImg.allocate(MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
    grayImage.allocate(MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
    // 検分器の読み込み
   haarFinder.setup("haarcascade_frontalface_alt2.xml");
}

void testApp::update(){
    bool bNewFrame = false;

    vidGrabber.grabFrame();
    bNewFrame = vidGrabber.isFrameNew();
    
    if (bNewFrame){
        // 取得した画像を解析するカラー画像の領域に格納
        colorImg.setFromPixels(vidGrabber.getPixels(), MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
        // カラー画像をグレースケールに変換
        grayImage = colorImg;
        // グレースケールオブジェクトを設定
        haarFinder.findHaarObjects(grayImage, 10, 10);
    }
}

void testApp::draw(){
    // 検出した顔の数を取得
    int numFace = haarFinder.blobs.size();
    
    float x[numFace], y[numFace], w[numFace], h[numFace]; 
    
     ofSetColor(0xffffff);
     
     // 通常の画像と顔を検出した画像の出力
    colorImg.draw(0, 0, MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
    colorImg.draw(MOVIE_INPUT_WSIZE, 0, MOVIE_INPUT_WSIZE, MOVIE_INPUT_HSIZE);
    
    //******************************
    // Face
    //******************************
   for(int i = 0; i < numFace; i++){
        x[i] = haarFinder.blobs[i].boundingRect.x;
        y[i] = haarFinder.blobs[i].boundingRect.y;
        w[i] = haarFinder.blobs[i].boundingRect.width;
        h[i] = haarFinder.blobs[i].boundingRect.height;
        // 検出した顔を白の四角で覆う
        ofSetColor(0xFFFFFF);
        ofRect(x[i]+MOVIE_INPUT_WSIZE, y[i], w[i], h[i]);
   }
}
おすすめ書籍

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください