实现效果
代码
import cv2# 加载人脸识别分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 打开摄像头
cap = cv2.VideoCapture(0)while True:# 读取摄像头捕获的帧ret, frame = cap.read()# 将帧转换为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用分类器检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在帧上绘制人脸框for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)# 显示结果图像cv2.imshow('人脸识别', frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()
解释
加载人脸识别分类器(理论可不看直接用就行)
1.cv2.CascadeClassifier()
是 OpenCV 提供的一个级联分类器对象,用于进行目标检测任务。在这行代码中,我们创建了一个名为face_cascade
的级联分类器对象。
2.'haarcascade_frontalface_default.xml'
是一个训练好的人脸检测器模型文件,它基于 Haar 特征和 Adaboost 算法进行训练。这个模型文件包含了用于检测人脸的特征和分类器参数。3.在运行这段代码之前,你需要确保
haarcascade_frontalface_default.xml
文件存在,并且位于当前工作目录下或者指定了正确的路径。(没有这个文件的可以私聊我)
打开摄像头
创建了一个
VideoCapture
对象,用于从摄像头读取视频流或者视频文件。
cv2.VideoCapture(0)
中的参数0
表示打开默认的摄像头设备。如果你的电脑上有多个摄像头,可以使用不同的整数值来选择不同的摄像头。通过创建
VideoCapture
对象,我们可以使用它提供的方法来获取连续的视频帧,然后对每一帧进行处理,如人脸检测、图像识别等
读取摄像头捕获的帧
从
cap
对象中读取一帧视频帧,并将结果赋值给frame
变量
cap.read()
方法返回两个值,第一个值ret
表示是否成功读取了一帧数据,如果成功则返回True
,否则返回False
。第二个值frame
是一个 Numpy 数组,表示读取到的视频帧。每次调用
cap.read()
方法都会读取下一帧视频帧,因此我们可以使用循环语句来不断读取视频流中的每一帧数据。
将帧转换为灰度图像
将读取到的彩色图像
frame
转换为灰度图像gray
OpenCV 中,许多图像处理操作需要使用灰度图像作为输入,而不是彩色图像。因此,在进行人脸检测、边缘检测、图像处理等操作时,通常需要先将彩色图像转换为灰度图像。
cv2.cvtColor()
是 OpenCV 提供的一个颜色空间转换函数,用于将图像从一个颜色空间转换到另一个颜色空间。其中,frame
是输入图像,cv2.COLOR_BGR2GRAY
是目标颜色空间,表示将图像从 BGR(蓝绿红)颜色空间转换为灰度颜色空间。
使用分类器检测人脸
gray
是输入的灰度图像,scaleFactor
是每个图像尺度的缩小比例,minNeighbors
是每个候选矩形应该保留的邻居矩形数目的最小值,minSize
是检测到的目标的最小尺寸。
在帧上绘制人脸框
for (x, y, w, h) in faces:
循环遍历每个检测到的人脸区域,并将其表示为(x, y, w, h)
四元组,其中(x, y)
是矩形左上角的坐标,w
和h
分别是矩形的宽度和高度。
cv2.rectangle()
是 OpenCV 提供的一个绘制矩形框的函数,用于在图像上绘制矩形。其中,frame
是要绘制矩形框的图像,(x, y)
和(x+w, y+h)
分别是矩形框左上角和右下角的坐标,(0, 255, 0)
是绘制矩形框的颜色(在 RGB 颜色空间中,绿色的值为 255,而红色和蓝色的值都为 0),2
是矩形框的线宽。