openFrameworks

【openFrameworks】ofxOpenCvで正面顏交換。 パイレーツオブカリブの人になった

ブログでの説明こちら
http://sudara-bluse.hatenablog.com/entry/openframeworks_19

こんにちはカリブの海賊になりました。

20171124084939.jpg

(アプリ、「星ドラ」でも海賊してます。)

今回はofxOpenCVで正面顔のフェイスチェンジをやってみました。
こんな感じです。これキャプチャですが動画です。
20171124085322.jpg

生きた動く人間2人でやるとかなり面白いです。
そう、snowみたいなやつですね。ささやかなsnowまねです。。粉雪。
snow楽しいですよね。snow作ってるって言ったらモテそうだな。。笑

ofxFaceTrackerだともっといい感じに交換できるのでしょうか。。

基本はこちらです。
http://sudara-bluse.hatenablog.com/entry/openframeworks_13

こちらのコードをトリビュートして作りました。
https://github.com/tkd55/FaceChange/blob/master/src/ofApp.cpp

実装方法
ofRectangle型(x,y,width,height) の配列を定義

検出した顔の数ループで回す。

setROI(faceRect.x,faceRect.y,faceRect.width,faceRect.height);
で正面顏を切り抜いて

drawROI(座標とサイズ)で上から描画
というような流れです。

コードはこちら

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; // 検分器


};

ofApp.cpp
#include "ofApp.h"


// 入力用の幅と高さ
#define W 640
#define H 480



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

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

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

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

}

//--------------------------------------------------------------
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(){

    // カラー映像出力
    colorImg.draw(0, 0, W*2, H*2);

    // 検出した顔の数をゲット
    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]);
        }
        else if( i == 1 ){
            // 座標基準を顔の左上に移動
            ofTranslate(faceRect[i].x, faceRect[i].y, 0);
            // 次に(2つ目)に検出した正面顔にはりつけ
            roiImg.drawROI(faceRect[i].x, faceRect[i].y, 2*faceRect[i].width, 2*faceRect[i].height);
        }
        // それ以外は無視
        else {
            break;
        }
    }
}

ブログでの説明こちら
http://sudara-bluse.hatenablog.com/entry/openframeworks_19

ofxFaceTrackerやりたくなってきた。
「パイレーツオブカリビアン 最後の海賊」シリーズ1の名作でした!泣きました笑
バルボッサ......泣

続く