// type parameter is rect + FEN sclass ChessOCR_TwoStageRecognizer extends SteppableAndBest> { replace Segmenter with IF1>. // input BufferedImage inputImage; Iterator segmenterStream; L rectQueue = new LinkedList; ChessPieceRecognizer pieceRecognizer; bool verbose; // internal new Set rectsTried; *() {} *(ChessPieceRecognizer *pieceRecognizer, BufferedImage *inputImage, Iterator *segmenterStream) {} public bool step() { if (nempty(rectQueue)) ret true with tryRect(popFirst(rectQueue)); if (segmenterStream.hasNext()) { Segmenter seg = segmenterStream.next(); if (seg == null) true; L rects = seg.get(inputImage); addAll(rectQueue, rects); if (verbose) print("Segmenter " + seg + " returned: " + rects); true; } false; } void tryRect(Rect r) { r = rectSetHeightToWidth(r); // square it if (!rectsTried.add(r)) ret; // seen BufferedImage board = clipBufferedImage(inputImage, r); S fen, double score = unpair chessOCR_recognizeBoard_FENAndScore(board, pieceRecognizer); best.put(pair(r, fen), score); } void verbose(bool verbose) { best.verboseNewBest = this.verbose = verbose; } }