今見てくれてる人の数

ホンキートンク・スーダラブルース

ゆるコラム、oF、邦ロックや歌謡曲、小説の感想。ドラクエ、JavaScript、ドラゴンボール超など。湘南あたりを転がってる石コロのゆるゆる生きてく超雑多な軌跡です。

【openFrameworks 冒険記13】ofxOpenCv で映像から顔検出!

ついにここまで来ました....顔の検知。目指せ「笑顔の検知」

今回はofxOpenCvを使ってカメラ映像から顔の検知をします!

f:id:sudara_bluse:20171117175831j:plain

 

こちらの基礎を理解してから読むといいです

www.sudara-bluse.tokyo

 

 

完成 動画はこんな感じです。誤検知も多少ありますね

最初、顔にモザイクかけたんすけど、犯罪者(失敗しそうなコンビニ強盗)

みたいになったのでいっそ晒します。。もはや失うものはありません!w

 

 

opencvでは物体検出にカスケード分類器というものを使うそうです。。

「たくさんの物体の特徴が定義されて、
機械学習された学習データのことを、カスケード分類器といいます。

今回はofxCvHaarFinder finder ;

finder.setup("haarcascade_frontalface_default.xml");

がそれにあたります。

 

実装内容

of_v0.9.8_osx_release/examples/addons/opencvHaarFinderExample/bin/data/haarcascade_frontalface_default.xmlのファイルをプロジェクトのbin/data内にコピーしときます。

f:id:sudara_bluse:20171118134100p:plain

 

ofApp.hで

    // カメラ入力画像、グレースケール映像を定義

    ofxCvColorImage colorImg;

    ofxCvGrayscaleImage grayImg;

ofApp.cppで

colorImg、grayImg

それぞれを処理するメモリ領域を確保   allocate(割り当てる)

// 顔検出 検分器の読み込み
finder.setup("haarcascade_frontalface_default.xml");

// グレースケールからオブジェクトを検知

finder.findHaarObjects(grayImg, 10, 10);

正面顔を検知してdrawで四角形を描画。

f:id:sudara_bluse:20171117175831j:plain

 

 

コード 

    

こちらのブログをトリビュートして処理を自分なりにリライトしてます。

openFrameworksで顔検出 | tkd55

 

ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxOpenCv.h"

class ofApp : public ofBaseApp{

    public:
        void setup();
        void update();
        void draw();

        void keyPressed(int key);
        void keyReleased(int key);
        void mouseMoved(int x, int y );
        void mouseDragged(int x, int y, int button);
        void mousePressed(int x, int y, int button);
        void mouseReleased(int x, int y, int button);
        void mouseEntered(int x, int y);
        void mouseExited(int x, int y);
        void windowResized(int w, int h);
        void dragEvent(ofDragInfo dragInfo);
        void gotMessage(ofMessage msg);

    // カメラ
    ofVideoGrabber cam;

    // カメラ入力画像
    ofxCvColorImage colorImg;
    // カメラ入力グレースケールの画像
    ofxCvGrayscaleImage grayImg;

    // サイズ定義
    const int W =  640;
    const int H = 480;

    // 顔検出器
    ofxCvHaarFinder finder;

};

ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){

    // 背景を黒に
    ofBackground(0, 0, 0);
    // カメラからの取り込み
    cam.initGrabber(W, H);
    // それぞれを処理するメモリ領域を確保   allocate(割り当てる)
    colorImg.allocate(W, H);
    grayImg.allocate(W, H);

    // 顔検出 検分器の読み込み;
    finder.setup("haarcascade_frontalface_default.xml");

}

//--------------------------------------------------------------
void ofApp::update(){

    // カメラの更新
    cam.update();

    // 一個一個のピクセルデータをカラーイメージにほりこんでる
    colorImg.setFromPixels(cam.getPixels().getData(), W, H);

    // グレースケールイメージにカラーデータを入れる
    grayImg = colorImg;

    // グレースケールかrオブジェクトを検知
    finder.findHaarObjects(grayImg);

}

//--------------------------------------------------------------
void ofApp::draw(){

    // 映像出力
    ofSetColor(255,255,255);
    colorImg.draw(0, 0, W, H);

    // 検出した全ての顔を黄色の四角で覆う
    for(int i = 0; i < finder.blobs.size(); i++) {

        // 黄色セット
        ofNoFill();
        ofSetLineWidth(5);
        ofSetColor(255,255,0);

        // 検知した正面顔のデータ(座標など)をfaceBoxにします
        ofRectangle faceBox = finder.blobs[i].boundingRect;

        // 四角形を描画
        ofDrawRectangle(faceBox.x, faceBox.y, faceBox.width, faceBox.height);
    }


}

 

 

次回はついに笑顔検知を目指したいっす!

続