예제 #1
0
파일: prep.py 프로젝트: tlcyr4/Redraw
    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)
    [
예제 #2
0
파일: Floor.py 프로젝트: tlcyr4/Redraw
    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)