// 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; // 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()) ret true with addAll(rectQueue, segmenterStream.next().get(inputImage)); 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 = verbose; } }