2017-01-10 7 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 
      ); 
     } 
    } 
    } 
} 

После тестирования несколько вещей, которые я думаю, что лучше всего, чтобы создать и массив объектов, которые содержат информацию для каждого сгустка (х и y, уровень) и заполнить этот массив методом drawContours. Однако у меня много проблем с получением правильной информации для хранения в этом массиве.

Так что мои вопросы:

  • Как определить х, у координаты сложных форм, таких, как эти сгустки
  • Как переставить сгустки когда у меня есть свой инфо-магазин в массиве

Любое предложение, даже используя другие методы (т. Е. Не обрабатывать), будет с благодарностью оценено.

+0

You хотите, чтобы их уложили в 3D? Объект blob имеет свойства x и y, к которым вы можете получить доступ, и я бы предположил, что уровень будет просто равен индексу blob в массиве. –

ответ

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); 
    } 
    } 
} 

Имейте в виду, я не запускаю этот код, и я не использовал framework, который вы используете, но функции beginShape(), vertex() и endShape() должны позволять вам создавать одни и те же линии между ребрами, и я добавил координату az в вершину, чтобы они были разделены по высоте.

Просто понял, что вы также можете просто пойти со следующей, поскольку линия (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

Итак, вы просто хотите знать, как создать пользовательский объект, содержащий ваш блокнот? и сохранить их в массиве? –

+0

Да. У меня нет проблем с созданием объектов, но я делаю с получением правильных данных для предоставления свойств объекту. Свойства, которые я хочу получить, - это координаты x и y блоба, что наиболее важно, а затем его уровень, как и по высоте относительно общей высоты макета. – LaVielle