!7 module LiveEyebrowFinder > DynImageSurface { transient BufferedImage lastImage; EyebrowFinder1 finder; transient ReliableSingleThread rstUpdateImage = dm_rst(this, r updateImage); transient S eyebrowState; start { if (finder == null) finder = defaultEyebrowFinder(); doEvery(100, rstUpdateImage); } visualize { JComponent c = super.visualize(); imageSurface_pixelated(imageSurface); ret centerAndSouth(c, withMargin(setFontSize(30, makeBold(jCenteredLiveValueLabel(dm_fieldLiveValue('eyebrowState)))))); } void updateImage enter { if (imageSurface == null) ret; final BufferedImage img = dm_webCamImage(); temp tempAfterwards(r { lastImage = img }); if (img == null || img == lastImage) ret; RectAndState found = finder.get(RGBImage(img)); if (setField(eyebrowState := found == null ? null : found.state)) vmBus_send('eyebrows, eyebrowState); setModuleName("Live Eyebrow Finder" + (found == null ? "" : " - " + found.state)); setSelection(rectAndStateToRect(found)); setImage(img); } }