def stopDetect(image, hsv):
    stop_detected = False

    #Stop detection
    # lowerR = np.array(boundaryR[0][0], dtype='uint8')
    # upperR = np.array(boundaryR[0][1], dtype='uint8')

    kernel = np.ones((3, 3), np.uint8)
    maskR = cv2.inRange(hsv, lowerR, upperR)
    maskR = cv2.morphologyEx(maskR, cv2.MORPH_CLOSE, kernel)
    # maskR = cv2.morphologyEx(maskR, cv2.MORPH_OPEN, kernel)

    maskR_cnt, maskR_max_cnt, maskR_approx = geom.find_main_contour_approx(
        maskR)
    try:
        shapeR, thresh = detect(maskR_max_cnt, maskR)
        if shapeR == 'octagon' and cv2.countNonZero(maskR) > 1000:
            cv2.putText(image, 'STOP',
                        (image.shape[1] - 100, image.shape[0] - 20),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
            stop_detected = True
    except:
        pass

    return image, stop_detected
def detect_stop_sign(image, boundaryR):
    lowerR = np.array(boundaryR[0][0], dtype='uint8')
    upperR = np.array(boundaryR[0][1], dtype='uint8')

    img = edge_enhancement(image)

    alpha = 1.5
    beta = 50
    res = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)

    hsv = cv2.cvtColor(res, cv2.COLOR_BGR2HSV)
    H, S, V = cv2.split(hsv)
    S = S + 50
    hsvR = cv2.merge((H, S, V))

    kernel = np.ones((3, 3), np.uint8)
    maskR = cv2.inRange(hsvR, lowerR, upperR)
    maskR = cv2.morphologyEx(maskR, cv2.MORPH_CLOSE, kernel)
    maskR = cv2.morphologyEx(maskR, cv2.MORPH_OPEN, kernel)
    cntR, max_cntR, approx_cntR = geom.find_main_contour_approx(maskR)
    try:
        shapeR, thresh = detect(max_cntR, maskR)
        if shapeR == 'octagon' and cv2.countNonZero(maskR) > 1000:
            cv2.putText(image, 'STOP',
                        (image.shape[1] - 100, image.shape[0] - 20),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    except:
        pass

    return image
def check_green_size(maskG):
    maskG_cnt, maskG_max_cnt, maskG_approx = geom.find_main_contour_approx(maskG)
    W = 0
    H = 0
    if (maskG_approx is not None) and len(maskG_approx) == 4:
        maskG_cnt = max(maskG_cnt, key=cv2.contourArea)
        maskG_rect = cv2.minAreaRect(maskG_cnt)
        W = int(maskG_rect[1][0])
        H = int(maskG_rect[1][1])
    maskG_size = W*H
    return maskG_approx, maskG_size
def check_STOP(image, maskR):
    cntR, max_cntR, approx_cntR = geom.find_main_contour_approx(maskR)
    if max_cntR is not None:
    # try:
        shapeR, thresh = detect(max_cntR, maskR)
        if shapeR == 'octagon' and cv2.countNonZero(maskR) > 1000:
            cv2.putText(image, 'STOP', (image.shape[1] - 100, image.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    # except:
    else:
        pass
    return image
def addressDetect(img, maskG):

    address = None

    maskG_cnt, _, maskG_approx = geom.find_main_contour_approx(maskG)
    W = 0
    H = 0
    if maskG_approx is not None and len(maskG_approx) == 4:
        maskG_cnt = max(maskG_cnt, key=cv2.contourArea)
        maskG_rect = cv2.minAreaRect(maskG_cnt)
        maskG_box = np.int0(cv2.boxPoints(maskG_rect))
        W = int(maskG_rect[1][0])
        H = int(maskG_rect[1][1])
    maskG_size = W * H

    if maskG_size >= 1000 and maskG_size < 3000:
        peri = cv2.arcLength(maskG_approx, True)
        approx = cv2.approxPolyDP(maskG_approx, 0.02 * peri, True)
        warp_img = warp(approx, img)

        thresh = make_thresh(warp_img)

        thresh_cut = []
        if thresh.shape[1] >= 45:
            for i in range(3):
                cut_size = thresh.shape[1] // 3
                if i == 2:
                    cut_img = thresh[:, i * cut_size:]
                else:
                    cut_img = thresh[:, i * cut_size:(i + 1) * cut_size]
                thresh_cut.append(cut_img)

            digits = []
            for i in range(3):
                cut_img = thresh_cut[i]
                each_cnts, max_cnt, box = geom.find_main_contour_box(cut_img.copy())
                (x, y, w, h) = cv2.boundingRect(max_cnt)
                # (x, y, w, h) = box
                if i == 0:
                    if w < 8:
                        digits.append(1)
                    else:
                        digits.append(2)
                elif i == 1:
                    digits.append(0)
                else:
                    if w < 8 and h >= 10:
                        digits.append(1)
                    elif h >= 10:
                        roi = cut_img[y:y + h, x:x + w]
                        (roiH, roiW) = roi.shape
                        # (dW, dH) = (int(roiW * 0.25), int(roiH * 0.15))
                        (dH, dW) = (int(roiH * 0.15), int(roiW * 0.2))
                        dHC = int(roiH * 0.1)
                        segments = [
                            ((0, 0), (roiW, dH)),  # top
                            ((0, dH), (dW, roiH // 2)),  # top-left
                            ((roiW - dW, dH), (roiW, roiH // 2)),  # top-right
                            ((0, (roiH // 2) - dHC), (roiW, (roiH // 2) + dHC)),  # center
                            ((0, roiH // 2), (dW, roiH)),  # bottom-left
                            ((roiW - dW, roiH // 2), (roiW, roiH)),  # bottom-right
                            ((0, roiH - dH), (roiW, roiH))  # bottom
                        ]
                        on = [0] * len(segments)
                        for (segi, ((xA, yA), (xB, yB))) in enumerate(segments):
                            segROI = roi[yA:yB, xA:xB]
                            total = cv2.countNonZero(segROI)
                            area = (xB - xA) * (yB - yA)
                            if total / float(area) > 0.55:
                                on[segi] = 1
                        try:
                            digit = DIGITS_LOOKUP[tuple(on)]
                            digits.append(digit)
                        except:
                            pass
            if len(digits) == 3:
                address = '{}{}{}'.format(*digits[:3])
                cv2.drawContours(img, [maskG_box], -1, (0, 255, 0), 2)
                cv2.putText(img, '{}{}{}'.format(*digits[:3]), (img.shape[1]-100, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    return img, address
def greenaddressDetect(img, maskG):

    addressFlag = False

    maskG_cnt, _, maskG_approx = geom.find_main_contour_approx(maskG)
    W = 0
    H = 0
    if maskG_approx is not None and len(maskG_approx) == 4:
        maskG_cnt = max(maskG_cnt, key=cv2.contourArea)
        maskG_rect = cv2.minAreaRect(maskG_cnt)
        maskG_box = np.int0(cv2.boxPoints(maskG_rect))
        W = int(maskG_rect[1][0])
        H = int(maskG_rect[1][1])
    maskG_size = W * H

    if maskG_size >= 1000 and maskG_size < 3000:    #FIXME
        addressFlag = True
        cv2.drawContours(img, [maskG_box], -1, (0, 255, 0), 2)
        # peri = cv2.arcLength(maskG_approx, True)
        # approx = cv2.approxPolyDP(maskG_approx, 0.02 * peri, True)
        # warp_img = warp(approx, img)
        #
        # thresh = make_thresh(warp_img)
        #
        # thresh_cut = []
        # if thresh.shape[1] >= 45:
        #     for i in range(3):
        #         cut_size = thresh.shape[1] // 3
        #         if i == 2:
        #             cut_img = thresh[:, i * cut_size:]
        #         else:
        #             cut_img = thresh[:, i * cut_size:(i + 1) * cut_size]
        #         thresh_cut.append(cut_img)
        #
        #     digits = []
        #     for i in range(3):
        #         cut_img = thresh_cut[i]
        #         each_cnts, max_cnt, box = geom.find_main_contour_box(cut_img.copy())
        #         (x, y, w, h) = cv2.boundingRect(max_cnt)
        #         # (x, y, w, h) = box
        #         if i == 0:
        #             if w < 8:
        #                 digits.append(1)
        #             else:
        #                 digits.append(2)
        #         elif i == 1:
        #             digits.append(0)
        #         else:
        #             if w < 8 and h >= 10:
        #                 digits.append(1)
        #             elif h >= 10:
        #                 roi = cut_img[y:y + h, x:x + w]
        #                 (roiH, roiW) = roi.shape
        #                 # (dW, dH) = (int(roiW * 0.25), int(roiH * 0.15))
        #                 (dH, dW) = (int(roiH * 0.15), int(roiW * 0.2))
        #                 dHC = int(roiH * 0.1)
        #                 segments = [
        #                     ((0, 0), (roiW, dH)),  # top
        #                     ((0, dH), (dW, roiH // 2)),  # top-left
        #                     ((roiW - dW, dH), (roiW, roiH // 2)),  # top-right
        #                     ((0, (roiH // 2) - dHC), (roiW, (roiH // 2) + dHC)),  # center
        #                     ((0, roiH // 2), (dW, roiH)),  # bottom-left
        #                     ((roiW - dW, roiH // 2), (roiW, roiH)),  # bottom-right
        #                     ((0, roiH - dH), (roiW, roiH))  # bottom
        #                 ]
        #                 on = [0] * len(segments)
        #                 for (segi, ((xA, yA), (xB, yB))) in enumerate(segments):
        #                     segROI = roi[yA:yB, xA:xB]
        #                     total = cv2.countNonZero(segROI)
        #                     area = (xB - xA) * (yB - yA)
        #                     if total / float(area) > 0.55:
        #                         on[segi] = 1
        #                 try:
        #                     digit = DIGITS_LOOKUP[tuple(on)]
        #                     digits.append(digit)
        #                 except:
        #                     pass
        #     if len(digits) == 3:
        #         address = '{}{}{}'.format(*digits[:3])
        #         cv2.drawContours(img, [maskG_box], -1, (0, 255, 0), 2)
        #         cv2.putText(img, '{}{}{}'.format(*digits[:3]), (img.shape[1]-100, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    return img, addressFlag
# cv2.waitKey(0)
# boundaries = [([60, 90, 80], [90, 255, 110])]  #GREEN
# boundaries = [([50, 80, 0], [90, 150, 20])] # sterling_demo 201
boundaries = [([40, 80, 0], [70, 255, 80])]  # sterling_demo2 102

lowerG = np.array(boundaries[0][0], dtype='uint8')
upperG = np.array(boundaries[0][1], dtype='uint8')

kernel = np.ones((3, 3), np.uint8)
mask = cv2.inRange(hsv, lowerG, upperG)
cv2.imshow('mask', mask)
# cv2.waitKey(0)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

img_copy = img.copy()
cnts, max_cont, approx_cnt = geom.find_main_contour_approx(mask)
cv2.drawContours(img_copy, max_cont, -1, (255, 0, 0), 2)
cv2.imshow('first contour', img_copy)
cv2.drawContours(img_copy, [approx_cnt], -1, (0, 0, 255), 2)
cv2.imshow('approx contour', img_copy)

peri = cv2.arcLength(approx_cnt, True)
approx = cv2.approxPolyDP(approx_cnt, 0.02 * peri, True)
if len(approx) == 4:
    our_cnt = approx
#
warp = warp(our_cnt, img)
cv2.imshow('warp image', warp)

warp_gray = cv2.cvtColor(warp, cv2.COLOR_BGR2GRAY)
cv2.imshow('warp gray', warp_gray)
    cv2.imshow('hsvG', hsvG)
    # cv2.waitKey(0)
    # make mask for Green and Red
    maskG, maskR = make_mask(hsvG, hsvR)
    cv2.imshow('Green Mask', maskG)
    # cv2.waitKey(0)

    maskG_equ = cv2.bitwise_and(equ, equ, mask = maskG)
    cv2.imshow('equ and mask', maskG_equ)
    cv2.waitKey(0)
    # check STOP sign is in frame
    stop_img_ = check_STOP(img_, maskR)

    # check Green mask size in frame
    # maskG_approx, maskG_size = check_green_size(maskG)
    maskG_cnt, maskG_max_cnt, maskG_approx = geom.find_main_contour_approx(maskG_equ)
    # cv2.drawContours(img_, maskG_cnt, -1, (0, 255, 0), 2)
    # cv2.imshow('mask Green contour', img_)
    # cv2.waitKey(0)
    W = 0
    H = 0
    if (maskG_approx is not None) and len(maskG_approx) == 4:
        maskG_cnt = max(maskG_cnt, key=cv2.contourArea)
        maskG_rect = cv2.minAreaRect(maskG_cnt)
        W = int(maskG_rect[1][0])
        H = int(maskG_rect[1][1])
    maskG_size = W*H
    # cv2.drawContours(img, maskG_cnt, -1, (0, 0, 255), 1)
    # cv2.imshow('Green contour', img)
    # cv2.waitKey(0)
hsvG = cv2.merge((H, S, V))
cv2.imshow('green hsv', hsvG)

kernel = np.ones((3, 3), np.uint8)
maskG = cv2.inRange(hsvG, lowerG, upperG)
maskG = cv2.morphologyEx(maskG, cv2.MORPH_CLOSE, kernel)
# maskG = cv2.morphologyEx(maskG, cv2.MORPH_OPEN, kernel)
cv2.imshow('green mask', maskG)

maskR = cv2.inRange(hsvR, lowerR, upperR)
maskR = cv2.morphologyEx(maskR, cv2.MORPH_CLOSE, kernel)
maskR = cv2.morphologyEx(maskR, cv2.MORPH_OPEN, kernel)
cv2.imshow('red mask', maskR)
# cv2.waitKey(0)

cntR, max_cntR, approx_cntR = geom.find_main_contour_approx(maskR)
cv2.drawContours(img, max_cntR, -1, (255, 0, 0), 2)
cv2.drawContours(img, approx_cntR, -1, (0, 255, 0), 2)
cv2.imshow('Red contours', img)
cv2.waitKey(0)
try:
    # maskR = cv2.morphologyEx(maskR, cv2.MORPH_CLOSE, kernel)
    shapeR, thresh = detect(max_cntR, maskR)
    if shapeR == 'octagon' and cv2.countNonZero(maskR) > 1000:
        cv2.putText(img_, 'STOP', (img_.shape[1]-100, img_.shape[0]-20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
except:
    pass

maskG_cnt, _, maskG_approx = geom.find_main_contour_approx(maskG)
# try:
#     maskG_cnt = max(maskG_cnt, key=cv2.contourArea)
Esempio n. 10
0
    cv2.imshow('B space', B)
    greenB = B.copy()
    greenB[B < 140] = 0
    greenB[B > 160] = 0
    maskG = cv2.bitwise_and(greenA, greenA, mask=greenB)

    maskG = cv2.morphologyEx(maskG, cv2.MORPH_OPEN, kernel)
    maskG = cv2.morphologyEx(maskG, cv2.MORPH_CLOSE, kernel)
    maskG = cv2.morphologyEx(maskG, cv2.MORPH_DILATE, kernel)
    cv2.imshow('after B space', greenB)
    cv2.imshow('mask for green', maskG)
    cv2.waitKey(0)

    start_time = time.time()

    maskR_cnt, maskR_max_cnt, maskR_approx = geom.find_main_contour_approx(
        maskR)
    try:
        shapeR, thresh = detect(maskR_max_cnt, maskR)
        if shapeR == 'octagon' and cv2.countNonZero(maskR) > 1000:
            cv2.putText(img_, 'STOP',
                        (img_.shape[1] - 100, img_.shape[0] - 20),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    except:
        pass

    maskG_cnt, maskG_max_cnt, maskG_approx = geom.find_main_contour_approx(
        maskG)
    cv2.drawContours(img_, maskG_cnt, -1, (0, 255, 0), 2)
    cv2.imshow('mask Green contour', img_)
    cv2.waitKey(0)
    W = 0