エッジの検出

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//This code has been arranged by Yasushi Noguchi. Last updated on June 21, 2008.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//BlobDetection by v3ga <http ://processing.v3ga.net>
//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<theblobdetection .getBlobNb() ; n++){
    b=theBlobDetection.getBlob(n);
    if (b!=null){  //もしオブジェクトがあったら、
      // Edges
      if (drawEdges){
        fill(0,0,255, 127);
        for (int m=0;m<b.getEdgeNb();m++){
          eA = b.getEdgeVertexA(m);  //エッジの点をそれぞれeA,eBに代入
          eB = b.getEdgeVertexB(m);
          if (eA !=null && eB !=null){
            //線を描く
            //line(eA.x*width, eA.y*height, eB.x*width, eB.y*height);
            //円を描く
            ellipse(eA.x*width, eA.y*height, 20, 20);
          }
        }
      }
    }
  }
}