オブジェクトの輪郭を検出するコードです。
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); } } } } } } |