Edited at

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

More than 1 year has passed since last update.

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

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



完成画はこんな感じです。 

(顔出しは恥ずかしいので最初モザイクかけたら

失敗したコンビニ強盗みたいになったのでいっそ晒します。

失うものなどもはやない)

動画

https://youtu.be/OgiqTnW2Vy0

多少の誤検知はありますね

 


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



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

}