sclass ChessOCR_Pipeline { replace Segmenter with IF1>. // input transient BufferedImage inputImage; ChessPieceRecognizer pieceRecognizer; // internal SeenAndQueue segmenters = new(r _runSegmenters); SeenAndQueue possibleBoardPositions = new(r _processPositions); // output new ChessOCR_BoardsFound boardsFound; // input segmenters & board position proposals: void addSegmenter(Segmenter s) { segmenters.add(s); } void addPossiblePosition(Rect r) { possibleBoardPositions.add(r); } bool queuesEmpty() { ret segmenters.queueEmpty() && possibleBoardPositions.queueEmpty(); } bool idle() { ret segmenters.idle() && possibleBoardPositions.idle(); } // internal void _processPositions() { for (Rect r : possibleBoardPositions.queueIterator()) boardsFound.add(setAll(pieceRecognizer.recognizeBoard(clipBufferedImage(inputImage, r)), rectInOriginalImage := r)); } void _runSegmenters() { for (Segmenter seg : segmenters.queueIterator()) possibleBoardPositions.addAll(seg.get(inputImage)); } void cleanMeUp { // cancels the threads too cleanUpAll(possibleBoardPositions, segmenters); } }