基於python +OpenCV Haar.xml進行人臉、眼、鼻特徵檢測

一、文件準備

haarcascades---各種分類器xml文件下載地址

二、代碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/20 11:23
# @File    : faceDetect.py
# @Software: PyCharm

import sys

import cv2

# face_model = "lbpcascade_frontalface.xml"
# face_model = "haarcascade_profileface.xml"
# face_model = "haarcascade_frontalface_alt2.xml"
face_model = "haarcascade_frontalface_default.xml"
eyes_model = "haarcascade_eye.xml"#  #haarcascade_eye.xml
mouth_model = "haarcascade_mcs_mouth.xml"
out_file = "output.avi"


def faceDetect(img, face_cascade,eyeCascade,mouth_detector):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.3,
        minNeighbors=5,
        minSize=(32, 32)
    )
    result = []

    for (x,y,w,h) in faces:
        fac_gray = gray[y: (y + h), x: (x + w)]
        ##
        # h_up = int(faces[0, -1] * 0.6)
        # head_up = fac_gray[0:h_up]
        # head_down = fac_gray[h_up:]

        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        eyes = eyeCascade.detectMultiScale(fac_gray, 1.3, 2)
        for (ex, ey, ew, eh) in eyes:
            result.append((x + ex, y + ey, ew, eh))
            # cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (255, 0, 0), 2)

        ##
        # mouth_zone = mouth_detector.detectMultiScale(fac_gray, 1.3, 5)
        # for (mx, my, mw, mh) in mouth_zone:
        #     cv2.rectangle(img, pt1=(mx, my), pt2=(mx + mw, my + mh), color=[255, 0, 0],
        #                   thickness=1)



    for (ex, ey, ew, eh) in result:
        cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
        # cv2.line(img,)


    # for (mx, my, mw, mh) in result1:
    #     cv2.rectangle(img, pt1=(mx, my), pt2=(mx + mw, my + mh ), color=[255, 0, 0],
    #                   thickness=1)

    return img


def main():
    cap = cv2.VideoCapture(0)
    # width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) + 0.5)
    # height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + 0.5)
    face_cascade = cv2.CascadeClassifier(face_model)
    eyeCascade = cv2.CascadeClassifier(eyes_model)
    mouth_detector = cv2.CascadeClassifier(mouth_model)
    # fourcc = cv2.VideoWriter_fourcc(*'flv1')  # 'F', 'L', 'V', '1'
    # video = cv2.VideoWriter(out_file, fourcc, 20.0, (width, height))
    while(True):
        ret, frame = cap.read()
        if ret == True:
            frame = faceDetect(frame, face_cascade,eyeCascade,mouth_detector)

        cv2.imshow("頭像檢測", frame)
        # video.write(frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # video.release()
    cap.release()
    cv2.destroyAllWindows()


main()

三、結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章