エッジの検出

オブジェクトの輪郭を検出するコードです。

//This code has been arranged by Yasushi Noguchi. Last updated on June 21, 2008.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//BlobDetection by v3ga 
//May 2005
//Processing(Beta) v0.85
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

import processing.video.*;
import blobDetection.*;

Capture cam;    //Capture型変数
BlobDetection theBlobDetection;    //BlobDetection型変数
PImage img;    //物体のトラッキングのために使われる画像
boolean newFrame=false;

// ==================================================
// setup()
// ==================================================
void setup(){
  //ウィンドウのサイズ
  size(640, 480);
  //キャプチャ型変数のcamを宣言
  cam = new Capture(this, 320, 240, 30);
  
  // BlobDetection
  //imgはキャプチャ映像よりも小さくできる
  img = new PImage(80,60); 
  //トラッキングを開始
  theBlobDetection = new BlobDetection(img.width, img.height);
  //暗い場所を探すにはfalse, 明るい場所はtrueにする
  theBlobDetection.setPosDiscrimination(false);
  theBlobDetection.setThreshold(0.5f); //しきい値の設定
}

// ==================================================
// captureEvent()
// ==================================================
void captureEvent(Capture cam){
  cam.read();    //カメラから映像を常に取り込む
  newFrame = true;
}

// ==================================================
// draw()
// ==================================================
void draw(){

  if (newFrame){    //新しいフレームがあったら、
    background(255);
    newFrame=false;
    image(cam,0,0,width,height);    //画像をウィンドウに表示
    //カメラ画像からトラッキング用の画像に変換しコピー
    img.copy(cam, 0, 0, cam.width, cam.height, 0, 0, img.width, img.height);
    theBlobDetection.computeBlobs(img.pixels);  //オブジェクトを探す
    drawEdges(true);    //オブジェクトの周辺を描く
  }
}

// ==================================================
// drawBlobsAndEdges()
// ==================================================
void drawEdges(boolean drawEdges){
  noFill();
  Blob b;    //オブジェクト用の変数
  EdgeVertex eA,eB;    //エッジの点
  
  //nはオブジェクトの数
  for (int n=0 ; n