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の関数はそのままの名前、ほぼそのままの呼び出し方で使えます。cvtColor
がconvertColor
になっていたり、微妙に違うこともあるみたいです?
処理した後の画像はupdate()
メソッドを呼び出してやらないと、draw()
してもきちんと表示されないので注意が必要です。
だいたいそんなもんで。説明するまでもない感じが素敵ですね。