!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++) { Recognizer recognizer = nu(Recognizer, +y1, +y2); 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); } abstract sclass Recognizer extends F1 { int y1, y2; 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-1, y1, x+1, y2); } }