OpenCV Module 11 : Phát hiện khuôn mặt
MVT
Đang cập nhật
Trong mô-đun này, chúng ta sẽ sử dụng một phương thức trong openCV để phát hiện khuôn mặt trong hình ảnh, video hoặc máy ảnh. Hãy nhớ rằng, mô-đun này chỉ phát hiện, không Nhận diện khuôn mặt.
Trước tiên, bạn cần tải xuống và nén tệp tại đây
Import thư viện cần dùng
import numpy as np import matplotlib.pyplot as plt import cv2
Trải nghiệm với một số hình ảnh trước khi bắt đầu code phát hiện khuôn mặt
We should create a function display to resuse multiply
def display_image(img, cmap="gray") : plt.figure(figsize=(12,10)) plt.imshow(img, cmap=cmap)
Read file image with opencv
messi = cv2.imread("DATA/LIONEL-MESSI.jpg",0) ronaldo = cv2.imread("DATA/ronaldo.jpg",0) realmadrid = cv2.imread("DATA/real-madrid.jpg.jpg",0)
display_image(messi)
display_image(realmadrid)
Phát hiện khuôn mặt trên hình ảnh
We will create utility function to detect the face not only image but video or camera
def detect_face(img) : face_img = img.copy() face_cascade = cv2.CascadeClassifier("DATA/haarcascades/haarcascade_frontalface_default.xml") face_rects = face_cascade.detectMultiScale(img, scaleFactor=1.2, minNeighbors=5) # You can play ground with 2 optional properties are scaleFactor and minNeighbors for (x,y,w,h) in face_rects : cv2.rectangle(face_img, (x,y), (x+w,y+h), (230,230,160), 5) return face_img
Apply above function to messi image
face_image = detect_face(messi) display_image(face_image)
detect_realmadrid = detect_face(realmadrid) display_image(detect_realmadrid)
Phát hiện khuôn mặt trên camera
video = cv2.VideoCapture(0) ret, frame = video.read() if not video.isOpened() : print("Could not open camera") sys.exit() while True : ret, frame = video.read() frame_copy = frame.copy() frame_copy = cv2.cvtColor(frame_copy, cv2.COLOR_BGR2GRAY) if not ret : break my_face = detect_face(frame_copy) timer = cv2.getTickCount() FPS = cv2.getTickFrequency() / (cv2.getTickCount() - timer) / 10000 cv2.putText(my_face, "FPS: " + str(int(FPS)), (40,20), cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0), 4) cv2.imshow("Detect Face", my_face) if cv2.waitKey(1) == 27 : break video.release() cv2.destroyAllWindows()
Code phát hiện khuôn mặt tốt hơn
video = cv2.VideoCapture(0) ret, frame = video.read() if not video.isOpened() : print("Could not open camera") sys.exit() face_cascade = cv2.CascadeClassifier("DATA/haarcascades/haarcascade_frontalface_default.xml") face_rects = face_cascade.detectMultiScale(frame) (face_x, face_y,face_w, face_h) = tuple(face_rects[0]) track_window = (face_x, face_y,face_w, face_h) roi = frame[face_y : face_y + face_h , face_x : face_x + face_w] roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) roi_hist = cv2.calcHist([roi_hsv],[0],None,[180], [0,180]) cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX) term_criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_EPS , 10, 1) while True : ret, frame = video.read() timer = cv2.getTickCount() FPS = cv2.getTickFrequency() / (cv2.getTickCount() - timer ) / 10000 if not ret or cv2.waitKey(1) == 27 : break hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1) # ===================== Using Mean shift to get track window ===================== # # retval, track_window = cv2.meanShift(dst,track_window,term_criteria) # if retval : # (x,y,w,h) = track_window # cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 5) # ===================== Using Cam shift to get track window ===================== # retval, track_window = cv2.CamShift(dst,track_window, term_criteria) if retval : pts = cv2.boxPoints(retval) pts = np.int32(pts) cv2.polylines(frame, [pts],True,(0,255,0), 5) cv2.putText(frame, "FPS: " + str(int(FPS)), (40,40), cv2.FONT_HERSHEY_SIMPLEX, 1 , (0,0,255), 1) cv2.imshow("Face detection", frame) video.release() cv2.destroyAllWindows()