sclass ChessOCR_Pipeline { replace Segmenter with IF1>. transient BufferedImage inputImage; new SeenAndQueue possibleBoardPositions; new ChessOCR_BoardsFound boardsFound; ChessPieceRecognizer pieceRecognizer; transient ReliableSingleThread rstProcessPositions = new(r processPositions); // segmenters transient ReliableSingleThread rstRunSegmenters = new(r runSegmenters); new SeenAndQueue segmenters; *() { possibleBoardPositions.onAddedToQueue(rstProcessPositions); segmenters.onAddedToQueue(rstRunSegmenters); } void addSegmenter(Segmenter s) { segmenters.add(s); } void addPossiblePosition(Rect r) { possibleBoardPositions.add(r); } // internal void processPositions() { Rect r; while not null (r = possibleBoardPositions.popQueue()) boardsFound.add(pieceRecognizer.recognizeBoard(clipBufferedImage(inputImage, r))); } void runSegmenters() { Segmenter seg; while not null (seg = segmenters.popQueue()) possibleBoardPositions.addAll(seg.get(inputImage)); } void cleanMeUp { // cancel the threads cleanUp(rstProcessPositions); cleanUp(rstRunSegmenters); } }