ofxCvを使ってwebカメラの映像をぼかしたりグレーにしたり輪郭取ったり

openFrameworksとOpenCVを組み合せると何か色々出来そうな気がするので、挑戦してみました。 標準で同梱されているofxOpenCvってやつを試したのですが、何か使いづらいので、ofxCvに鞍替え。 まとまったドキュメントが見合たらないのがかなしいのですが、インターフェースは生のOpenCVと似ているのでC/C++向けのOpenCV経験者なら迷うことは無いと思います。

で。openFrameworksの機能でwebカメラの映像を取得して、ofxCvの機能で加工してみたいと思います。 やりたいのはこんな感じのことです。

生の画像とぼかした画像、グレースケール、あと輪郭の画像をまとめたやつ。

左上が生の映像、右上がガウシアンブラーをかけたやつ、左下がグレースケール、右下がCanny法で作った輪郭の映像です。

ソースコードはこんな感じ。

#include <ofMain.h>
#include <ofxCv.h>


class ofApp : public ofBaseApp {
private:
    ofVideoGrabber cam;
    ofImage blur, gray, edge;

public:
    void setup() override {
        cam.setup(320, 240);
    }

    void update() override {
        cam.update();

        if(cam.isFrameNew()){
            ofxCv::GaussianBlur(cam, blur, 16);
            ofxCv::convertColor(cam, gray, CV_RGB2GRAY);
            ofxCv::Canny(gray, edge, 50, 150);

            gray.update();
            edge.update();
            blur.update();
        }
    }

    void draw() override {
        cam.draw(0, 0);
        blur.draw(320, 0);

        gray.draw(0, 240);
        edge.draw(320, 240);
    }
};


int main() {
    ofSetupOpenGL(640, 480, OF_WINDOW);

    ofRunApp(new ofApp());
}

ofVideoGrabberってクラスでwebカメラの映像を取得しています。 こいつは動画ファイルを読み込む事も出来るらしいので、リアルタイムの映像でなくてもいけます。

ofxCvの関数はofxCvってそのまんまの名前空間の中に入っています。分かりやすい。 OpenCVの関数はそのままの名前、ほぼそのままの呼び出し方で使えます。cvtColorconvertColorになっていたり、微妙に違うこともあるみたいです?

処理した後の画像はupdate()メソッドを呼び出してやらないと、draw()してもきちんと表示されないので注意が必要です。

だいたいそんなもんで。説明するまでもない感じが素敵ですね。