openCV Note

Cascade classifier class for object detection.
openCV Note

def harr_cascade(cascade_dir, frame):
    # frame = imutils.resize(frame, width=231)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # initialize a dictionary that maps the name of the haar cascades to
    # their filenames
    detectorPaths = {
        "face": "haarcascade_frontalface_default.xml",
        "eyes": "haarcascade_eye.xml",
        "smile": "haarcascade_smile.xml",
    }

    # initialize a dictionary to store our haar cascade detectors
    print("[INFO] loading haar cascades...")
    detectors = {}
    # loop over our detector paths
    for (name, path) in detectorPaths.items():
        # load the haar cascade from disk and store it in the detectors
        # dictionary
        path = os.path.sep.join([cascade_dir, path])
        detectors[name] = cv2.CascadeClassifier(path)

    # perform face detection using the appropriate haar cascade
    faceRects = detectors["face"].detectMultiScale(
        gray, scaleFactor=1.05, minNeighbors=16, minSize=(100-20, 120-20),
        # maxSize=(100+20,120+20),
        flags=cv2.CASCADE_SCALE_IMAGE)

    confidence = []
    # loop over the face bounding boxes
    for (fX, fY, fW, fH) in faceRects:
        # extract the face ROI
        faceROI = gray[fY:fY + fH, fX:fX + fW]
        # draw the face bounding box on the frame
        cv2.rectangle(frame, (fX, fY), (fX + fW, fY + fH),
                      (0, 255, 0), 2)
        c = 0

        # apply eyes detection to the face ROI
        normal_eye_w = 22
        normal_eye_h = 10
        slack_eye  = 8
        eyeRects = detectors["eyes"].detectMultiScale(
            faceROI, scaleFactor=1.03, minNeighbors=6,
            minSize=(normal_eye_w - slack_eye, normal_eye_h - slack_eye),
            maxSize=(normal_eye_w + 2*slack_eye, normal_eye_h + 2*slack_eye),
            flags=cv2.CASCADE_SCALE_IMAGE)
        if len(eyeRects) > 0:
            c += 1
        if len(eyeRects) == 2:
            c += 1
        # loop over the eye bounding boxes and draw the eye bounding box on the frame
        for (eX, eY, eW, eH) in eyeRects:
            # draw the eye bounding box
            ptA = (fX + eX, fY + eY)
            ptB = (fX + eX + eW, fY + eY + eH)
            cv2.rectangle(frame, ptA, ptB, (0, 0, 255), 2)

        # apply smile(mouth) detection to the face ROI
        normal_mouth_w = 41
        normal_mouth_h = 11
        slack_mouth =8
        smileRects = detectors["smile"].detectMultiScale(
            faceROI, scaleFactor=1.03, minNeighbors=56,
            minSize=(normal_mouth_w - slack_mouth, normal_mouth_h - slack_mouth ),
            maxSize=(normal_mouth_w + 2*slack_mouth, normal_mouth_h + 2*slack_mouth),
            flags=cv2.CASCADE_SCALE_IMAGE)
        if len(smileRects) > 0:
            c += 1
        if len(smileRects) == 1:
            c += 1
            # loop over the smile bounding boxes
        for (sX, sY, sW, sH) in smileRects:
            # draw the smile bounding box
            ptA = (fX + sX, fY + sY)
            ptB = (fX + sX + sW, fY + sY + sH)
            cv2.rectangle(frame, ptA, ptB, (255, 0, 0), 2)

        confidence.append(c)

    idx = sorted(range(len(confidence)), key= lambda k:confidence[k], reverse=True)

    if(len(idx) > 0):
        box = faceRects[idx[0]]
        fX, fY, fW, fH = box
        cv2.rectangle(frame, (fX, fY), (fX + fW, fY + fH),
                  (255, 255, 255), 2)

        return box
上一篇:信号完整性之眼图(eye)理解


下一篇:【MySQL】MySQL性能优化工具集