1.项目概述
人脸检测是OpenCV中比较简单的项目。
这个项目是一个基于Python和OpenCV库实现的简单人脸检测程序。项目实现通过摄像头捕获的实时视频流或读取指定的视频文件,来检测并标记出视频中的人脸。同时,程序还会将检测结果写入到一个新的视频文件中。
程序逻辑是首先创建一个输出目录(如果不存在的话),以确保处理后的视频文件可以被保存到指定的位置。然后,它使用OpenCV的CascadeClassifier加载一个预训练的人脸检测模型,并对视频的每一帧进行灰度转换,以便进行人脸检测。检测到的人脸会用绿色的矩形框标记出来,并在窗口中实时显示。同时,程序还会将检测结果写入到一个新的视频文件中,以便后续查看或分析。用户可以通过按'q'键来退出程序。
2.操作步骤
首先,在安装的cv2的包中找到data/haarcascades该文件夹包括了所有opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。
找到后复制其地址
这个项目是一个基于Python和OpenCV库实现的简单人脸检测程序。它通过摄像头捕获实时视频流或读取指定的视频文件,来检测并标记出视频中的人脸,同时将检测结果保存到一个新的视频文件中。程序的主要思路如下:
创建输出目录:确保处理后的视频文件能够保存到指定位置。如果指定的输出目录不存在,则创建它。
视频捕获:根据参数决定是从摄像头捕获视频还是从文件读取视频。如果选择文件但未提供文件路径,会打印错误消息并退出。
视频属性获取:获取视频的宽度、高度和帧率,这些信息对于创建视频写入器是必需的。
视频写入器初始化:使用cv2.VideoWriter创建视频写入器,指定输出文件名、编解码器、帧率和帧大小。
人脸识别模型加载:使用cv2.CascadeClassifier加载Haar特征分类器,该分类器用于检测图像中的人脸。
视频处理循环:从视频捕获设备或文件中读取帧,进行人脸检测,并在检测到的人脸周围绘制矩形框。
灰度转换:将视频帧从BGR转换为灰度图像。
人脸检测:使用分类器在灰度图像上检测人脸,并返回检测到的人脸矩形框的坐标。
绘制矩形框:在原始视频帧上根据检测到的人脸坐标绘制矩形框。
显示和保存结果:显示处理后的视频帧,并将其写入到指定的输出视频文件中。
退出条件:如果按下'q'键或视频结束,退出循环,释放资源并关闭所有窗口。
示例调用包括使用摄像头和读取视频文件的两种方式:
使用摄像头:face_detection(useCamera=True)
使用视频文件:face_detection(useCamera=False, video_file="video/zhangge.mp4", output_video="result/face2.mp4")
import cv2
import os
def face_detection(useCamera=False, video_file=None, output_video="result/face.mp4"):
# 创建输出目录这一部分代码的目的是确保程序将处理后的视频文件保存到一个有效的目录中。如果指定的输出目录不存在,这段代码将创建该目录,以避免由于目录不存在而导致保存视频文件失败的错误。
output_dir = os.path.dirname(output_video)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 1.调用摄像头或者读取视频
cv2.namedWindow("CaptureFace")
if useCamera:
cap = cv2.VideoCapture(0) # 默认设备索引为0
else:
if video_file is None:
print("请提供视频文件路径或设置使用摄像头")
return
cap = cv2.VideoCapture(video_file)
if not cap.isOpened():
print("无法打开摄像头或视频文件")
return
# 获取视频的宽度、高度和帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 创建视频写入器
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter(output_video, fourcc, fps, (width, height))
# 2.人脸识别模型
face_detect = cv2.CascadeClassifier(
r"D:\env\envs\yolov5\Lib\site-packages\cv2\data\haarcascade_frontalface_alt2.xml")#将复制的地址填入
color = (0, 255, 0)
while cap.isOpened():
flag, frame = cap.read()
if useCamera:
frame = cv2.flip(frame, 1) # 镜像操作
if not flag:
print("Error")
break
# 3.灰度转换
img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 4.人脸检测
detect = face_detect.detectMultiScale(img_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(detect) > 0: # 大于0则检测到人脸
for faceRect in detect: # 单独框出每一张人脸
x, y, w, h = faceRect
# 5.画图
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)
# 显示结果
cv2.imshow("CaptureFace", frame)
# 写入检测结果到视频文件
out.write(frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
# 示例调用函数
# 使用摄像头
#face_detection(useCamera=True)
# 使用视频文件
face_detection(useCamera=False, video_file="video/zhangge.mp4", output_video="result/face2.mp4")
首先调用视频文件:
face_detection(useCamera=False, video_file="video/zhangge.mp4", output_video="result/face2.mp4")
结果:
再来调用摄像头:
face_detection(useCamera=True)