利用OpenCV在图片和摄像头中检测人脸
本文主要介绍了如何利用OpenCV检测图片或摄像头视频中的人脸。
1 检测图片中人脸
import numpy as np
import cv2
#定义检测函数
def detect(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#定义级联检测器,并检测
face_cascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
#显示检测到的人脸
for (x,y,w,h) in faces:
img = cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#读入一张照片并检测
img1 = cv2.imread("../fahai.jpg")
detect(img1)
2 从摄像头视频中检测人脸和眼睛
#定义视频检测人脸函数
def video_detect(cap, window, videoWriter): #(视频流对象,显示窗口,写出流对象)
#定义级联检测器
face_cascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier("cascades/haarcascade_eye.xml")
ret, frame = cap.read() #提取一帧图像
while(ret and cv2.waitKey(1)==-1):
#对提取到的一帧图像进行检测
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
#将检测框标在图像中
for (x,y,w,h) in faces:
frame = cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 2)
#从提取到的人脸中检测眼睛
roi = gray[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi, 1.03, 5, 0, (40,40))
#将眼睛检测框画到图像中
for (ex,ey,ew,eh) in eyes:
frame = cv2.rectangle(frame,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,255,0),2)
cv2.imshow(window, frame) #显示图像
videoWriter.write(frame) #图像保存
ret, frame = cap.read()
import cv2
cv2.namedWindow("myWindow") #创建一个窗口
#创建视频流对象和写出流对象
cap = cv2.VideoCapture(0)
fps = 15
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('myvideo2.mp4',
cv2.VideoWriter_fourcc(*'mpeg'), fps, size)
#也可以写成字符格式cv2.VideoWriter_fourcc('m','p','4','v')
#开始检测
video_detect(cap, "myWindow", videoWriter)
#释放资源
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
小结:
- detectMultiScale用法 https://blog.csdn.net/weixin_42309501/article/details/80781293
- 视频可以转成各种格式,注意cv2.VideoWriter中文件后缀和fourcc格式(('m','p','4','v')格式的视频占用空间更小)