!7 module WebCamFaceFinder > DynImageSurface { transient BufferedImage lastImage; FaceFinderByPictures1 finder; bool overlay, useFullFinder; transient ReliableSingleThread rstUpdateImage = dm_rst(this, r updateImage); enhanceFrame { dm_boolMenuItem(f, 'useFullFinder, onSet := r { setField(finder := null); makeFinder() }); } start { makeFinder(); doEvery(100, rstUpdateImage); } void makeFinder { if (finder == null) setField(finder := unstructFileOpt(javaxDataDir( useFullFinder ? "Face Finder/full-finder.struct" : "Face Finder/smallest-finder-over-95.struct" ));) if (finder == null) setField(finder := defaultFaceFinderByPictures()); } visualize { JComponent c = super.visualize(); imageSurface_pixelated(imageSurface); //set flag bindCheckBoxToLiveValue_debug. //set flag dm_fieldLiveValue_debug. ret withCenteredButtons(c, jLiveValueCheckBox("Overlay", dm_fieldLiveValue('overlay))); } void updateImage enter { if (imageSurface == null) ret; final BufferedImage img = dm_webCamImage(); temp tempAfterwards(r { lastImage = img }); if (img == null || img == lastImage) ret; FoundImgPlus found = finder.getPlus(RGBImage(img)); setSelection(foundImgToRect(found)); if (overlay) { BufferedImage img2 = cloneBufferedImage(img); if (found != null) //fillRect(img2, found.r, Color.white); drawScaledPixelatedImage(img2, toBufferedImage(found.data), found.r); setImage(img2); } else setImage(img); } }