2017-01-10 10 views
1

blobDetection libraryを使用して高さマップから等高線マップを作成しています。私の最終的な目標は、ブロブをレーザーカットして、建築景観の模造品を作ることです。処理中の特定のブロブを特定する

enter image description here

現在、私は輪郭を取得し、素晴らしいですSVGとして等高線マップをエクスポートするが、私は、各ブロブ(または輪郭、またはリング)を識別することができるようにしたいし、次に操作できるようにすることができます各輪郭は別々につまり、ウィンドウの上に配置し直し、重なり合わないようにしたいのです。私はまた、個々のブロブに座標を割り当てたいので、一旦それがレーザーカットされると、それぞれのブロブがどこに行くのかを簡単に知ることができます。ここで

は(著者v3gaによって提供された例から)コードです:

import processing.svg.*; 
import blobDetection.*; 
import peasy.*; 
import processing.pdf.*; 

PeasyCam cam; 
PImage img; 

float levels = 10; 
float factor = 10; 
float elevation = 125; 

float colorStart = 0; 
float colorRange = 160; 

BlobDetection[] contours = new BlobDetection[int(levels)]; 

boolean recording = false; 
void keyPressed(){ 
    if (key == 'r' || key == 'R'){ 
    recording = !recording; 
    } 
} 

void setup() { 

    size(1000,800,P3D); 
    surface.setResizable(true); 

    img = loadImage("map1.gif"); 
    surface.setSize(img.width, img.height); 

    cam = new PeasyCam(this, img.width, img.height, 0, 500); 
    colorMode(HSB, 360, 100, 100); 

    for (int i=0; i<levels; i++){ 
    contours[i] = new BlobDetection(img.width, img.height); 
    contours[i].setThreshold(i/levels); 
    contours[i].computeBlobs(img.pixels); 
    } 

} 

void draw(){ 

    if (recording){ 
    beginRecord(SVG, "frame_####.svg"); 
    } 

    for (int i=0; i<levels; i++){ 
    drawContours(i); 
    } 

    if (recording) { 
    endRecord(); 
    recording = false; 
    } 

} 

void drawContours(int i) { 
    Blob b; 
    EdgeVertex eA,eB; 
    for (int n=0 ; n<contours[i].getBlobNb() ; n++) { 
    b=contours[i].getBlob(n); 
    if (b!=null) { 
     stroke(250,75,90); 
     for (int m=0;m<b.getEdgeNb();m++) { 
     eA = b.getEdgeVertexA(m); 
     eB = b.getEdgeVertexB(m); 
     if (eA !=null && eB !=null) 
      line(
      eA.x*img.width, eA.y*img.height, 
      eB.x*img.width, eB.y*img.height 
      ); 
     } 
    } 
    } 
} 

いくつかのことをテストした後、私は最高のは、xを作成し、各ブロブのための情報を含むオブジェクトの配列(することだと思うし、 y座標、レベル)を取得し、この配列をdrawContoursメソッドで指定します。しかし、私はこの配列に格納するための適切な情報を得ることが非常に困難です。

だから私の質問は以下のとおりです。

  • Xを特定する方法、などこれらの塊のような複雑な形状
  • のy座標Iは、配列
で自分の情報ストアを持ったら、ブロブを再配置する方法

他のテクニック(たとえProcessingではない)を使用していても、どんな提案でも大歓迎です。 3Dでブロブを表示するには

+0

あなたにそれらを3Dで積み上げて見たいですか? blobオブジェクトにはアクセスできるxプロパティとyプロパティがあり、レベルはBLOBのインデックスと同じになると思います。 –

答えて

0

は、上部にheight_scale定数を追加し、次へdrawContours機能を変更します。

final int HEIGHT_SCALE = 10; // amount of z space between each blob 

void drawContours(int i) { 
    Blob b; 
    EdgeVertex eA,eB; 
    for (int n=0 ; n<contours[i].getBlobNb() ; n++) { 
    b=contours[i].getBlob(n); 
    if (b!=null) { 
     stroke(250,75,90); 
     beginShape(); 
     for (int m=0;m<b.getEdgeNb();m++) { 
     eA = b.getEdgeVertexA(m); 
     eB = b.getEdgeVertexB(m); 
     if (eA !=null && eB !=null) 
      vertex(eA.x*img.width, eA.y*img.height, i*HEIGHT_SCALE); 
      vertex(eB.x*img.width, eB.y*img.height, i*HEIGHT_SCALE); 
     } 
     endShape(CLOSE); 
    } 
    } 
} 

を、私はこのコードを実行していない、と私は使用していない点に注意してくださいbeginShape()、vertex()、およびendShape()関数は、エッジ間に同じ行を作成できるようにする必要があります。頂点に高さが分かれるようにz座標を追加しました。

ちょうどあなたがまた、単に次の行(X1、Y1、X2、Y2)もラインを取ることができるので(X1、Y1、Z1、X2、Y2、Z2)で行くことが実現:

final int HEIGHT_SCALE = 10; // amount of z space between each blob 

void drawContours(int i) { 
    Blob b; 
    EdgeVertex eA,eB; 
    for (int n=0 ; n<contours[i].getBlobNb() ; n++) { 
    b=contours[i].getBlob(n); 
    if (b!=null) { 
     stroke(250,75,90); 
     for (int m=0;m<b.getEdgeNb();m++) { 
     eA = b.getEdgeVertexA(m); 
     eB = b.getEdgeVertexB(m); 
     if (eA !=null && eB !=null) 
      line(eA.x*img.width, eA.y*img.height, i*HEIGHT_SCALE, eB.x*img.width, eB.y*img.height, i*HEIGHT_SCALE); 
     } 
    } 
    } 
} 
+0

私はこのプロジェクトでは必要ないので元の例のいくつかの部分を省略しましたが、はい、マップを3Dでレンダリングすることができます。輪郭 'translate(0,0、elevation/levels); in 'drawContours()'を呼び出すループ(プログラムの先頭で宣言された変数を使用します)。 – LaVielle

+0

あなたはちょうどあなたのBLOBを保持するカスタムオブジェクトを作成する方法を知りたいですか?それらを配列に格納しますか? –

+0

はい。私はオブジェクトの作成に問題はありませんが、オブジェクトにプロパティを与えるための適切なデータを取得することで行います。私が得たいプロパティは、ブロブのx座標とy座標、最も重要なのはレベル、そしてその高さは、マケットの全高さに対する相対座標です。 – LaVielle

関連する問題