BlankTar

about | blog | works | photo

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()してもきちんと表示されないので注意が必要です。

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

< openFrameworksを使ったlinuxでの開発をIDE抜きで ofxCvで笑い男をやってみた >