cclist = [1] for cc in ccs: if cc in fn: cclist = ccs[cc] areas = sorted(stats[:, cv.CC_STAT_AREA])[::-1] img[:, :] = 0 for i in cclist: img[stats[labelled, cv.CC_STAT_AREA] == areas[i - 1]] = 255 if "-clean" in sys.argv: cv.imwrite(outFilename, img) exit() segment = Segment(img) hulls = [segment.convex_hull(cc) for cc in range(1, 1 + len(cclist))] origins = (Point(segment.bbox(cc)[0::2]) for cc in range(1, 1 + len(cclist))) segment = Segment(img) bboxes = [segment.bbox(label) for label in segment.labels if label != 0] left = min(bbox[0] for bbox in bboxes) right = max(bbox[1] for bbox in bboxes) top = min(bbox[2] for bbox in bboxes) bottom = max(bbox[3] for bbox in bboxes) bbox = (left, right, top, bottom) # bring back things inside convex hull mask = cv.cvtColor(np.zeros(img.shape, dtype="uint8"), cv.COLOR_GRAY2RGB) [
def find_doors(self, cluttered, close_door, corr_thresh = .025): rdfs = ("door3.png", "slant.png", "halfdoor.png") ref_doors = [find_border(cv.imread(f, cv.IMREAD_GRAYSCALE)) for f in rdfs] segments = self.segments rooms = segments["rooms"] # if verbose: # defect_canvas = cv.cvtColor(np.zeros(rooms.img.shape, dtype="uint8"), cv.COLOR_GRAY2RGB) for room_label in rooms.labels: if room_label == 0: continue # skip the blackness if room_label == 231 and self.building == "0627" and self.floornum == "3": continue # cut out room labels left, right, top, bottom = rooms.bbox(room_label) roomlabels = rooms.labelled[top:bottom, left:right] # isolate whiteness of other connected components inverted = np.copy(segments["no_text"].img[top:bottom,left:right]) inverted[roomlabels == room_label] = 0 # seal up gaps left by gray cabinets in Whitman if cluttered: cv.morphologyEx(inverted, cv.MORPH_CLOSE, self.kernel, inverted, iterations = 3) if close_door: cv.morphologyEx(inverted, cv.MORPH_OPEN, self.kernel, inverted, iterations = 3) # filter out everything not in the convex hull of the room hull = rooms.convex_hull(room_label) hullDrawing = cv.cvtColor(np.zeros(roomlabels.shape, dtype="uint8"), cv.COLOR_GRAY2RGB) hullDrawing = cv.drawContours(hullDrawing, hull, 0, WHITE, thickness = -1) hullDrawing = cv.cvtColor(hullDrawing, cv.COLOR_RGB2GRAY) inverted = cv.bitwise_and(inverted, hullDrawing) defects = Segment(inverted) defects.cc_threshold(2250, 25000) for defect_label in defects.labels: if defect_label == 0: continue defect_left,defect_right,defect_top,defect_bottom = defects.bbox(defect_label) # check to make sure defect actually touches connected component if not any(roomlabels[j,i] == room_label for i,j in [ [defect_left+1,defect_bottom-1], [defect_left+1,defect_top+1], [defect_right-1,defect_bottom-1], [defect_right-1,defect_top+1] ]): continue defect_cutout = defects.cutout(defect_label) contours = find_border(defect_cutout) correlation = min([cv.matchShapes(ref_door[0], contours[0], 1, 0.0) for ref_door in ref_doors]) if correlation < corr_thresh: bbox = [left + defect_left, left + defect_right, top + defect_top, top + defect_bottom] centroid = tuple(map(int, defects.centroids[defect_label])) door = Door(bbox, contours, rooms.labelled[centroid[::-1]], room_label, (defect_left,defect_top)) self.doors.append(door)