LoginSignup
4
2

More than 1 year has passed since last update.

[openFramewoks] ofxOpenCv で映像から顔検出

Last updated at Posted at 2017-11-18

ついにここまで来ました....顔検知。目指せ「笑顔の検知」
ofxOpenCvを使ってカメラ映像から顔の検知をします

 

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内にコピーしときます。

スクリーンショット 2017-11-18 13.17.19.png


ofApp.hで
    // カメラ入力画像、グレースケール映像を定義
    ofxCvColorImage colorImg;
    ofxCvGrayscaleImage grayImg;

ofApp.cppで
colorImg、grayImg
それぞれを処理するメモリ領域を確保   allocate(割り当てる)

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

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

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

こちらをトリビュートしてコード記述
http://www.tkd55.net/?p=532

コード

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);

        // 正面顔を検知認識
        ofRectangle faceBox = finder.blobs[i].boundingRect;

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


}

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2