memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

背景差分で動画にちょっとしたエフェクト?をつけてみた

リモートワークしながらYouTube Musicを聴いていました。

たまたま聴いたのが以下の曲。ちょっと生っぽい音源で気になったので映像を観てみるとこれがまたカッコいい。

www.youtube.com

何回か観ているうちに、骨格抽出してCGモデルとか動かせたらカッコいいだろうな。。。と。

ただ、動画像から簡単に抽出するライブラリはまだないようだったので、とりあえずProcessingのOpenCVライブラリで何かしようかとサンプルをいじいじ。

いじいじした動画は、自分のPC上でQuickTimeを使って画面録画しました。音声はなしで。

とりあえず、できたのが以下でした。

www.youtube.com

ほとんどサンプルと同じですが、コードも置いておきます。

import gab.opencv.*;
import java.awt.Rectangle;
import processing.video.*;

OpenCV opencv;
Movie video;
Rectangle[] faces;

void setup() {
  size(1164, 324);
  video = new Movie(this, "twice.mov");
  opencv = new OpenCV(this, 1164, 324);
  opencv.startBackgroundSubtraction(5, 3, 0.5);
  video.loop();
  video.play();  
  colorMode(HSB);
}

void movieEvent(Movie m) {
  m.read();
}

void draw() {
  background(0);
  image(video, 0, 0); 
  opencv.loadImage(video);
  opencv.updateBackground();
  opencv.dilate();
  opencv.erode();

noStroke();
  for (Contour contour : opencv.findContours()) {
    if (contour.area() > 1000) {
      Rectangle a = contour.getBoundingBox();
      fill(random(255),255,255,80);
//      circle(a.x+a.width/2, a.y+a.height/2, 50);
      rect(a.x, a.y, a.width, a.height);
    }
  }
}

かっこいいですね。