Warning: session_start(): open(/var/lib/php/sessions/sess_c15346d794u3qi4hgphpgbtri6, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cmodule ImageSegmenter > DynImageSurface {
// parameters
int blur;
bool distanceFromColor;
int dc_r, dc_g, dc_b;
float contrastThreshold = 0.5f;
int gridSize = 2;
DoubleRange widthRange = new(0, 1);
DoubleRange heightRange = new(0, 1);
DoubleRange xRange = new(0, 1);
DoubleRange yRange = new(0, 1);
// output
L segments;
transient JLabel lblFound;
transient ReliableSingleThread rst = dm_rst(this, r segmentIt);
visualize {
JSlider slider = main.onChange(jLiveValueSlider(dm_fieldLiveValue('contrastThreshold)), rst);
JSpinner spinner = main.onChange(spinner, dm_spinner gridSize(2, 10), rst);
JSpinner blurSpinner = main.onChange(dm_spinner blur(0, 10), rst);
JComponent sup = super.visualize();
overlaySelectionsOnImageSurface(imageSurface, segments);
ret withCenteredLinesBelow(sup,
ll(jsection("Preprocessing", jline(
withLabel("Blur:", blurSpinner),
dm_checkBox("Distance from color:", 'distanceFromColor),
withLabel("R:", main.onChange(dm_spinner dc_r(0, 255), rst)),
withLabel("G:", main.onChange(dm_spinner dc_g(0, 255), rst)),
withLabel("B:", main.onChange(dm_spinner dc_b(0, 255), rst))))),
ll(
withLabel("Contrast Threshold:", slider),
withLabel("Grid size:", spinner),
jbutton("Segment", rst),
withLabel("Segments found:", lblFound = jlabel(l_str(segments))),
jPopDownButton_noText(
"Show segments", rThread showSegments
)),
ll(
withLabel("Width range:", main.onChange(doubleRangeLiveValueSlider(dm_fieldLiveValue('widthRange)), rst)),
withLabel("Height range:", main.onChange(doubleRangeLiveValueSlider(dm_fieldLiveValue('heightRange)), rst))),
ll(
withLabel("X position:", main.onChange(doubleRangeLiveValueSlider(dm_fieldLiveValue('xRange)), rst)),
withLabel("Y position:", main.onChange(doubleRangeLiveValueSlider(dm_fieldLiveValue('yRange)), rst))));
}
start {
if (!hasImage()) setImage(whiteImage(100, 100));
dm_vmBus_onMessage('newClipboardContents, voidfunc(O o) {
if (o cast BufferedImage) thread { setImage(o); rst.trigger(); }
});
}
void segmentIt enter {
if (!hasImage()) ret;
int w = imageWidth(), h = imageHeight();
BufferedImage image = getImage();
if (blur == 0)
imageSurface.imageToDraw = null;
else
image = imageSurface.imageToDraw = new BoxBlurFilter(blur).filter(image, null);
new AutoSegmenter as;
as.g = gridSize;
as.contrastThreshold = contrastThreshold;
BWImage bw;
if (distanceFromColor)
image = img_distanceFromColor(image, rgbFromInt(dc_r, dc_g, dc_b));
else
bw = BWImage(image);
L segments = as.go();
IntRange wr = doubleToIntRange_endPlus1(w, widthRange);
IntRange hr = doubleToIntRange_endPlus1(h, heightRange);
IntRange xr = doubleToIntRange_endPlus1(w, xRange);
IntRange yr = doubleToIntRange_endPlus1(h, yRange);
printVars_str(+wr, +hr, +xr, +yr);
segments = filterRectsByWidthRange(segments, wr);
segments = filterRectsByHeightRange(segments, hr);
segments = filterRectsByCenterXRange(segments, xr);
segments = filterRectsByCenterYRange(segments, yr);
setField(+segments);
setText(lblFound, l_str(segments));
overlaySelectionsOnImageSurface(imageSurface, segments);
}
void showSegments {
L segments = this.segments;
showImage(n2(segments, "segment") + " found",
mergeBufferedImagesVertically(map(segments, r -> clipBufferedImage(getImage(), r))));
}
}