Libraryless. Click here for Pure Java version (5559L/36K).
sclass CheesyRecognizer { BWIntegralImage inputImage; new L<Prototype> prototypes; new Map<Int, ScaledInputImage> scaledInputImages; // key = width class Prototype { BWIntegralImage image; new Map<Int, ScaledPrototype> scaledPrototypes; // key = width *(BWImage image) { this.image = BWIntegralImage(image); } ScaledPrototype scaledPrototype(int width) { ret mapGetOrCreate(scaledPrototypes, width, () -> new ScaledPrototype(this, scaleDownUsingIntegralImageBW(image, width))); } } class ScaledInputImage { BWImage image; *(BWImage *image) {} Rect scaleToInputImage(Rect r) { ret scaleRect(doubleRatio(inputImage.getWidth(), image.getWidth()), r); } int getHeight() { ret image.getHeight(); } } class ScaledPrototype { Prototype prototype; BWImage image; *(Prototype *prototype, BWImage *image) {} int getHeight() { ret image.getHeight(); } } *(BWImage inputImage) { this.inputImage = bwIntegralImage(inputImage); } *(BufferedImage inputImage) { this(BWImage(inputImage)); } void fullScan(ScaledInputImage img, ScaledPrototype proto, float minSimilarity, IVF2<Rect, Double> onFound) { bwImageSearch_onFound_allCandidates(img.image, proto.image, minSimilarity, onFound); } LPair<Rect, Double> fullScanToNBest(ScaledInputImage img, ScaledPrototype proto, float minSimilarity, int n) { new LPair<Rect, Double> list; fullScan(img, proto, minSimilarity, (r, score) -> list.add(pair(r, score))); sortBySecondOfPairsDesc_inPlace(list); ret takeFirst(n, list); } // compare scaled prototype to scaled image at some location Pair<Rect, Double> singleCheck(ScaledInputImage img, ScaledPrototype prototype, int x, int y, float minSimilarity) { BWImage proto = prototype.image, image = img.image; int wp = proto.getWidth(), hp = proto.getHeight(); float sim = bwImageSectionsSimilarity2(image, proto, x, y, minSimilarity); ret sim < minSimilarity ? null : pair(new Rect(x, y, wp, hp), (double) sim); } ScaledInputImage scaledInputImage(int width) { ret mapGetOrCreate(scaledInputImages, width, () -> new ScaledInputImage(scaleDownUsingIntegralImageBW(inputImage, width))); } Prototype addPrototype(BWImage img) { ret addAndReturn(prototypes, new Prototype(img)); } LPair<Rect, Double> fullScanToNBest(Prototype proto, int imageWidth, int protoWidth, float minSimilarity, int n) { ScaledInputImage scaled = scaledInputImage(imageWidth); ret mapPairsA(r -> scaled.scaleToInputImage(r), fullScanToNBest(scaled, proto.scaledPrototype(protoWidth), 0f, n)); } int getWidth() { ret inputImage.getWidth(); } int getHeight() { ret inputImage.getHeight(); } }
download show line numbers debug dex old transpilations
Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
Snippet ID: | #1027278 |
Snippet name: | CheesyRecognizer - cheaty image recognition by scanning for prototype images [dev.] |
Eternal ID of this version: | #1027278/33 |
Text MD5: | 9d7eeddb86f3dfa5d43783f0a5bb7660 |
Transpilation MD5: | 465da5a721e314a71e8195211012e8d1 |
Author: | stefan |
Category: | javax / image recognition |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2020-02-29 17:21:55 |
Source code size: | 2878 bytes / 80 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 303 / 751 |
Version history: | 32 change(s) |
Referenced in: | #1034167 - Standard Classes + Interfaces (LIVE, continuation of #1003674) |