public PointList nextCurve(float prop) { Matrix dragonTurn = TransformUtilities.rotationMatrixAboutPoint((-Math.PI/2f)*prop, startOfDragon.getX(), startOfDragon.getY()); PointList newCurve = this.currentCurve.transform(dragonTurn); return newCurve; }
public PointList nextHalfCurve() { Matrix dragonTurn = TransformUtilities.rotationMatrixAboutPoint(-Math.PI/2f, startOfDragon.getX(), startOfDragon.getY()); PointList newCurve = this.currentCurve.transform(dragonTurn); return newCurve; }
public PointList nextCurve(float prop) { Matrix dragonTurn = TransformUtilities.rotationMatrixAboutPoint((-Math.PI/2f)*prop, startOfDragon.getX(), startOfDragon.getY()); PointList newCurve = this.currentCurve.transform(dragonTurn); return newCurve; }
public PointList nextHalfCurve() { Matrix dragonTurn = TransformUtilities.rotationMatrixAboutPoint(-Math.PI/2f, startOfDragon.getX(), startOfDragon.getY()); PointList newCurve = this.currentCurve.transform(dragonTurn); return newCurve; }
public void iterate() { PointList newCurve = nextHalfCurve(); Collections.reverse(newCurve.points); for (Point2d point2d : this.currentCurve) { if(!point2d.equals(this.startOfDragon)) newCurve.points.add(point2d); } Point2dImpl minXY = minXY(newCurve); Point2dImpl maxXY = maxXY(newCurve); double bbScalar = Math.max(maxXY.x - minXY.x,maxXY.y - minXY.y); Matrix translateToPointMatrix = TransformUtilities.translateToPointMatrix( minXY, new Point2dImpl(1/3f,1/3f) ); Matrix translate = translateToPointMatrix; float d = (float) ((1/3f)/bbScalar); Matrix scale = TransformUtilities.scaleMatrix(d, d); Matrix transform = translate.times(scale); // Matrix transform = translate; newCurve = newCurve.transform(transform); this.currentCurve = newCurve; this.startOfDragon = newCurve.points.get(0); this.endOfDragon = newCurve.points.get(newCurve.points.size()-1); }
public void iterate() { PointList newCurve = nextHalfCurve(); Collections.reverse(newCurve.points); for (Point2d point2d : this.currentCurve) { if(!point2d.equals(this.startOfDragon)) newCurve.points.add(point2d); } Point2dImpl minXY = minXY(newCurve); Point2dImpl maxXY = maxXY(newCurve); double bbScalar = Math.max(maxXY.x - minXY.x,maxXY.y - minXY.y); Matrix translateToPointMatrix = TransformUtilities.translateToPointMatrix( minXY, new Point2dImpl(1/3f,1/3f) ); Matrix translate = translateToPointMatrix; float d = (float) ((1/3f)/bbScalar); Matrix scale = TransformUtilities.scaleMatrix(d, d); Matrix transform = translate.times(scale); // Matrix transform = translate; newCurve = newCurve.transform(transform); this.currentCurve = newCurve; this.startOfDragon = newCurve.points.get(0); this.endOfDragon = newCurve.points.get(newCurve.points.size()-1); }
/** * Perform multi-resolution fitting of the initial shape to * the initial image. * * @param initialImage the initial shape. * @param initialShape the initial image. * @return the fitted model parameters. */ public IterationResult fit(I initialImage, PointList initialShape) { SimplePyramid<I> pyr = SimplePyramid.createGaussianPyramid(initialImage, sigma, numLevels); Matrix scaling = TransformUtilities.scaleMatrix(1.0/Math.pow(2, numLevels-1), 1.0/Math.pow(2, numLevels-1)); PointList shape = initialShape.transform(scaling); Matrix pose = null; double [] parameters = null; double fit = 0; for (int level=numLevels-1; level>=0; level--) { I image = pyr.pyramid[level]; ActiveShapeModel<I> asm = asms[level]; IterationResult newData = asm.fit(image, shape); if (level == 0) scaling = Matrix.identity(3, 3); else scaling = TransformUtilities.scaleMatrix(2, 2); shape = newData.shape.transform(scaling); pose = newData.pose.times(scaling); fit = newData.fit; parameters = newData.parameters; } return new IterationResult(pose, shape, fit, parameters); }
/** * Perform multi-resolution fitting of the initial shape to * the initial image. * * @param initialImage the initial shape. * @param initialShape the initial image. * @return the fitted model parameters. */ public IterationResult fit(I initialImage, PointList initialShape) { SimplePyramid<I> pyr = SimplePyramid.createGaussianPyramid(initialImage, sigma, numLevels); Matrix scaling = TransformUtilities.scaleMatrix(1.0/Math.pow(2, numLevels-1), 1.0/Math.pow(2, numLevels-1)); PointList shape = initialShape.transform(scaling); Matrix pose = null; double [] parameters = null; double fit = 0; for (int level=numLevels-1; level>=0; level--) { I image = pyr.pyramid[level]; ActiveShapeModel<I> asm = asms[level]; IterationResult newData = asm.fit(image, shape); if (level == 0) scaling = Matrix.identity(3, 3); else scaling = TransformUtilities.scaleMatrix(2, 2); shape = newData.shape.transform(scaling); pose = newData.pose.times(scaling); fit = newData.fit; parameters = newData.parameters; } return new IterationResult(pose, shape, fit, parameters); }
public void iterate(StepListener listener, int nSteps) { PointList newCurve = null; for (int i = 0; i <= nSteps; i++) { newCurve = nextCurve((float)i/nSteps); Collections.reverse(newCurve.points); for (Point2d point2d : this.currentCurve) { if(!point2d.equals(this.startOfDragon)) newCurve.points.add(point2d); } prune(newCurve); Point2dImpl minXY = minXY(newCurve); Point2dImpl maxXY = maxXY(newCurve); double bbScalar = Math.max(maxXY.x - minXY.x,maxXY.y - minXY.y); Matrix translateToPointMatrix = TransformUtilities.translateToPointMatrix( minXY, new Point2dImpl(1/3f,1/3f) ); Matrix translate = translateToPointMatrix; float d = (float) ((1/3f)/bbScalar); Matrix scale = TransformUtilities.scaleMatrix(d, d); Matrix transform = translate.times(scale); // Matrix transform = translate; newCurve = newCurve.transform(transform); listener.state(newCurve); } this.currentCurve = newCurve; this.startOfDragon = newCurve.points.get(0); this.endOfDragon = newCurve.points.get(newCurve.points.size()-1); }
public void iterate(StepListener listener, int nSteps) { PointList newCurve = null; for (int i = 0; i <= nSteps; i++) { newCurve = nextCurve((float)i/nSteps); Collections.reverse(newCurve.points); for (Point2d point2d : this.currentCurve) { if(!point2d.equals(this.startOfDragon)) newCurve.points.add(point2d); } prune(newCurve); Point2dImpl minXY = minXY(newCurve); Point2dImpl maxXY = maxXY(newCurve); double bbScalar = Math.max(maxXY.x - minXY.x,maxXY.y - minXY.y); Matrix translateToPointMatrix = TransformUtilities.translateToPointMatrix( minXY, new Point2dImpl(1/3f,1/3f) ); Matrix translate = translateToPointMatrix; float d = (float) ((1/3f)/bbScalar); Matrix scale = TransformUtilities.scaleMatrix(d, d); Matrix transform = translate.times(scale); // Matrix transform = translate; newCurve = newCurve.transform(transform); listener.state(newCurve); } this.currentCurve = newCurve; this.startOfDragon = newCurve.points.get(0); this.endOfDragon = newCurve.points.get(newCurve.points.size()-1); }
@Override protected void updateNextFrame(FImage frame) { frame.fill(0f); if (animate) { System.arraycopy(a.nextValue(), 0, currentValue, 0, currentValue.length); } else { for (int i = 0; i < N; i++) { final double v = sliders[i].getValue() * stdev[i] / 100.0; currentValue[i] = v; } } final PointList newShape = pdm.generateNewShape(currentValue); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(300, 300).times( TransformUtilities.scaleMatrix(150, 150))); final List<Line2d> lines = connections.getLines(tfShape); frame.drawLines(lines, 1, 1f); for (final Point2d pt : tfShape) { frame.drawPoint(pt, 1f, 5); } for (int i = 0; i < N; i++) { final int newVal = (int) (100.0 * currentValue[i] / stdev[i]); sliders[i].setValue(newVal); } } }, base);
@Override protected void updateNextFrame(FImage frame) { frame.fill(0f); if (animate) { System.arraycopy(a.nextValue(), 0, currentValue, 0, currentValue.length); } else { for (int i = 0; i < N; i++) { final double v = sliders[i].getValue() * stdev[i] / 100.0; currentValue[i] = v; } } final PointList newShape = pdm.generateNewShape(currentValue); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(300, 300).times( TransformUtilities.scaleMatrix(150, 150))); final List<Line2d> lines = connections.getLines(tfShape); frame.drawLines(lines, 1, 1f); for (final Point2d pt : tfShape) { frame.drawPoint(pt, 1f, 5); } for (int i = 0; i < N; i++) { final int newVal = (int) (100.0 * currentValue[i] / stdev[i]); sliders[i].setValue(newVal); } } }, base);
newShape = pdm.generateNewShape(parameters).transform(pose);
@Override protected void updateNextFrame(FImage frame) { frame.fill(0f); final PointList newShape = pdm.generateNewShape(a.nextValue()); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(300, 300).times( TransformUtilities.scaleMatrix(150, 150))); final List<Line2d> lines = connections.getLines(tfShape); frame.drawLines(lines, 1, 1f); for (final Point2d pt : tfShape) { final Line2d normal = connections.calculateNormalLine(pt, tfShape, 10f); if (normal != null) { frame.drawLine(normal, 1, 0.5f); } } } });
@Override protected void updateNextFrame(FImage frame) { frame.fill(0f); final PointList newShape = pdm.generateNewShape(a.nextValue()); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(300, 300).times( TransformUtilities.scaleMatrix(150, 150))); final List<Line2d> lines = connections.getLines(tfShape); frame.drawLines(lines, 1, 1f); for (final Point2d pt : tfShape) { final Line2d normal = connections.calculateNormalLine(pt, tfShape, 10f); if (normal != null) { frame.drawLine(normal, 1, 0.5f); } } } });
final PointList projected = observed.transform(pose.inverse());
image.fill(1); final PointList newShape = pdm.generateNewShape(a.nextValue()); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(100, 100).times( TransformUtilities.scaleMatrix(50, 50)));
image.fill(1); final PointList newShape = pdm.generateNewShape(a.nextValue()); final PointList tfShape = newShape.transform(TransformUtilities.translateMatrix(100, 100).times( TransformUtilities.scaleMatrix(50, 50)));
final PointList shape = inst.firstObject().transform(pose); rgb.drawLines(connections.getLines(shape), 1, RGBColour.RED);
final PointList shape = inst.firstObject().transform(pose); rgb.drawLines(connections.getLines(shape), 1, RGBColour.RED);