asclass DynWebCamAnalyzer > DynImageSurfaceAndEnabled { switchable bool overlay; transient ReliableSingleThread rstUpdateImage = dm_rst(this, r updateImage); transient long analysisTime = -1; // ns for analysis transient S info; transient JLabel lblInfo; transient BufferedImage inputImage; transient int w, h; // will be set to width & height of inputImage start-thread { doEvery(100, rstUpdateImage); } afterVisualize { imageSurface_pixelated(imageSurface); containerAddFirst(buttons, lblInfo = dm_label info(), dm_checkBox('overlay)); } void updateImage enter { if (imageSurface == null || !enabled) ret; BufferedImage img = dm_webCamImage(); temp tempAfterwards(r { inputImage = img }); if (img == null || img == inputImage) ret; w = img.getWidth(); h = img.getHeight(); long time = nanoTime(); pcall { analyzeImage(); } analysisTime = nanoTime()-time; BufferedImage img2 = img; if (overlay) pcall { drawOverlays(img2 = cloneBufferedImage(img)); } setImage(img2); } // overlord me, uh, i mean, overload me // can use inputImage, w, h and setInfo void analyzeImage() { } // overlooooad me if you want void drawOverlays(BufferedImage img) { } void setInfo(S info) { setField(+info); } }