一、文件準備
二、代碼
#!/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()
三、結果