[openFramewoks] ofxOpenCv で映像から顔検出
ついにここまで来ました....顔検知。目指せ「笑顔の検知」
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内にコピーしときます。
↓
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);
}
}
#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;
};
#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);
}
}
Author And Source
この問題について([openFramewoks] ofxOpenCv で映像から顔検出), 我々は、より多くの情報をここで見つけました https://qiita.com/39_isao/items/f8615e25e51c860e7d27著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .