後輩からProcessingとOpenCVで背景差分を取りたいと相談を受けたため、そのプログラムをつくりました。
この記事ではProcessingとOpenCVを使って背景差分を取る方法について解説していきます。
目次
import hypermedia.video.*;
OpenCV opencv; //OpenCVのオブジェクトです。
PImage binImage; // これが最終目標(変わった部分が白、変わらなかった部分が黒の二値画像)
boolean bLearnBgImage = true; // 背景画像を撮るフラグ
void setup(){
size(640, 480);
opencv = new OpenCV(this);
opencv.capture(width, height);
}
void draw(){
opencv.read(); // カメラから画像を取得
opencv.flip(OpenCV.FLIP_HORIZONTAL); // 鏡写しにする
if(bLearnBgImage){ // 背景撮るなら
opencv.remember(OpenCV.SOURCE, OpenCV.FLIP_HORIZONTAL); // メモリーに画像を保存
bLearnBgImage = false; // flagを切る。
}
opencv.absDiff();// 背景画像と今の画像の差の絶対値をとる
opencv.convert(OpenCV.GRAY); // グレイスケールに変換
opencv.blur(OpenCV.BLUR, 5); // ノイズを消すためにぼかす
opencv.threshold(30); // スレッショルドを指定
binImage = opencv.image(); // 最終目標!!!
image(binImage, 0, 0); //表示
}
void keyPressed(){
if(key == ' '){ // スペースキーが押されたら
bLearnBgImage = true; // 背景を撮る
}
}