asclass DynWebCamAnalyzer > DynImageSurfaceAndEnabled { switchable bool overlay; transient ReliableSingleThread rstUpdateImage = dm_rst(this, r updateImage); transient long duration = -1; // ms per recognition transient JLabel lblInfo; transient BufferedImage inputImage; start-thread { doEvery(100, rstUpdateImage); } afterVisualize { imageSurface_pixelated(imageSurface); containerAddFirst(buttons, lblInfo = jlabel(), 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; analyzeImage(); if (overlay) drawOverlays(img = cloneBufferedImage(img)); setImage(img); } // overlord me, uh, i mean, overload me void analyzeImage() { } // overlooooad me if you want void drawOverlays(BufferedImage img) { } }