def process(self, frame, name="TrainingSamples/Image_"): # preprocessing for contour detection preprocessed = PreProcessing().background_contour_removal(frame) # find contours using algorithm by Suzuki et al. (1985) contours, hierarchy = cv.findContours(preprocessed, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) # limit observed contours if len(contours) > 500: contours = contours[:500] # ignore first contour, as it is outer border of the frame contours = contours[1:] hierarchy = hierarchy[0][1:] - 1 hierarchy = np.where(hierarchy < 0, -1, hierarchy) if len(contours) == 0: return preprocessed # initialize contour object from each contour in contour list binarized = PreProcessing().custom_binarize(frame) contourList = [ Contour(contour=cnt, imgShape=frame.shape, frameBinary=binarized) for cnt in contours ] # filter, classify and group segmented contours sg = Segmentation(contourList, hierarchy, frame.shape) sg.group_and_classify() filtered = sg.get_contours() if len(filtered) == 0: return preprocessed # colouring preprocessing for ease in debugging preprocessed = cv.cvtColor(preprocessed, cv.COLOR_GRAY2BGR) lines = LineOrdering(filtered).get_lines(frame) # label contours with additional positional information lines = sg.label_contours(lines) for l in range(len(lines)): line = lines[l] for i in range(len(line)): cnt = line[i] cv.putText(frame, str(l) + str(i), (cnt.center[0], cnt.center[1]), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 1) solutions = [ self.solver.solve([cnt.unwrap() for cnt in line], frame) for line in lines if len(line) > 2 ] return preprocessed # orderedImage