!7 static int width = 8; p-exp { L images = markedFaces_scaledToWidth(width); int h = first(images).image.w(); new Best best; for (int y1 = 0; y1 < h; y1++) for (int y2 = y1+1; y2 <= h; y2++) for (int deltaX1 = -3; deltaX1 <= 0; deltaX1++) for (int deltaX2 = deltaX1+1; deltaX2 <= 3; deltaX2++) { Recognizer recognizer = nu(Recognizer, +y1, +y2, +deltaX1, +deltaX2); new Scorer scorer; double tolerance = width/2.0; for (RGBImageAndRect i : images) { Rect guessed = recognizer.get(i.image); //print(i.rect + " - " + guessed); video_scoreRect_x(scorer, i.rect, guessed, tolerance); } print(sfu(recognizer) + " => " + scorer); best.put(recognizer, scorer!); } print(best); } sclass Recognizer extends F1 { int y1, y2, deltaX1, deltaX2; public Rect get(RGBImage img) { //print(f2s(img.file)); RGBImage img2 = rgbClipLineRange(img, y1, y2); float[] f = rgbImageColumnBrightnesses(img2); //printStruct(f); int x = indexOfSmallestFloat(f); ret rectFromPoints(x+deltaX1, y1, x+deltaX2, y2); } toString { ret sfu(this); } }