我正在使用blobDetection library从高度图制作轮廓图。我的最终目标是激光切割斑点,制作出一些建筑景观模型。
目前我可以获得轮廓并将轮廓图导出为SVG,这很棒,但我希望能够识别每个斑点(或轮廓或环),然后能够分别操纵每个轮廓。也就是说,我想在窗口上重新定位它们,使它们不在彼此之上并且不重叠。我还想为每个blob分配坐标,以便在激光切割后每个blob的位置都很容易知道。
这是代码(来自作者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
);
}
}
}
}
在测试了一些事情后,我认为最好是创建包含每个blob(x和y坐标,级别)信息的对象数组,并在drawContours方法中填充此数组。但是,我在获取存储在此数组中的正确信息时遇到了很多麻烦。
所以我的问题是:
任何建议,即使使用其他技术(即非处理),我们将不胜感激。
答案 0 :(得分: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);
}
}
}
}