今見てくれてる人の数

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

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

【openFrameworks 冒険記20】ofxOpenCv 画像の上にカメラ入力の正面顏を貼り付けてJKに....

こんにちは、JKです。

あたし、青春まっただ中。野球部のマネージャーしてます💌

今回はofxOpenCvで背景jpg画像の上に

カメラ入力の正面顏を貼り付けてみました。

コード

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; // カメラカラー画像
    ofxCvColorImage roiImg; // 切り抜いた顔の影像用
    ofxCvGrayscaleImage grayImg; // グレースケール用
    ofxCvHaarFinder haarFinder; // 検分器
    ofImage bgImg; // 背景の女子高生の画像
};

ofApp.cpp
#include "ofApp.h"


// カメラ入力用の幅と高さ
#define W 320
#define H 240

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

    ofBackground(0, 0, 0);

    // カメラ起動
    cam.initGrabber(W,H);

    // 処理領域確保
    colorImg.allocate(W,H);
    roiImg.allocate(W,H);
    grayImg.allocate(W,H);

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

    // 背景画像読み込み
    bgImg.load("bg.jpg");

}

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

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

    // カメラから取り込んだフレームをカラーピクセル画像として取得
    colorImg.setFromPixels(cam.getPixels().getData(), W, H);
    roiImg.setFromPixels(cam.getPixels().getData(), W, H);

    // グレースケールに変換
    grayImg = colorImg;

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

}

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


    ofSetColor(255,255,255);
    // 背景画像描画
    bgImg.draw(0,0);
    // カラー映像描画
    colorImg.draw(10, 100, W, H);


    // 検出した顔の数をゲット
    int FaceNum = haarFinder.blobs.size();

    //ofRectangle(x,y,width,height)が入ってます。 の配列 定義
    ofRectangle faceRect[FaceNum];

    //検出数分ループ
    for(int i = 0; i < FaceNum; i++){

        faceRect[i] = haarFinder.blobs[i].boundingRect;

        if( i == 0 ){
            // 最初(1つ目)に検出した正面顔を切り抜き
            roiImg.setROI(faceRect[i]);
            // うまいこと女の子の顔の部分に乗せる(本来ならGUIにして微調整すべきかもしれない)
            roiImg.drawROI(500, 130, 150, 150);

        }
        // 1つの顔以外は無視
        else {
            break;
        }
    }

}

 

f:id:sudara_bluse:20171124162624p:plain

 

寒くなってきたから、

お鍋でも食べてあったまって。

風邪引かないでね💌