1

私はblobDetection ライブラリを使用して高さマップから等高線マップを作成する処理に取り組んでいます。私の最終的な目標は、ブロブをレーザーカットして、一種の建築景観の模型を作ることです.

ここに画像の説明を入力

現在、輪郭を取得して輪郭マップを 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 座標を特定する方法
  • 配列に情報ストアを作成したら、ブロブの位置を変更する方法

他の手法 (つまり、処理ではない) を使用する場合でも、任意の提案をいただければ幸いです。

4

1 に答える 1

0

ブロブを 3D で表示するには、上部に 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 座標を追加しました。

line(x1,y1,x2,y2) も line(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);
      }
    }
  }
}
于 2017-01-10T23:01:56.250 に答える