文章目录
前言
人脸检测是Opencv的入门项目,本文可以为想学习Opencv的朋友提供一个基础的项目联系,也可以让零基础的朋友感受Opencv究竟是个什么东西。每一行代码都详细解释了,哪怕是你没有一点基础也可以彻底搞懂。
一、环境配置
因为是由python实现,所以我们需要安装pycharm,然后跟着下面的步骤创建环境并且安装cv2库。
1.创建虚拟环境:
打开 Anaconda Prompt(或命令提示符,如果 Anaconda 已添加到系统路径中)。
输入以下命令创建一个名为 myenv 的新环境(你可以将 myenv 替换为你想要的环境名称):
conda create --name myenv
当提示时,输入 y 确认安装。
2.激活环境:
创建环境后,输入以下命令激活环境:
conda activate myenv
3.安装 OpenCV:
在激活的环境中,输入以下命令安装 OpenCV:
conda install -c conda-forge opencv
到这里我们就完成了准备工作。
二、代码解释
1.引入库
import cv2
2.创建窗口:
cv2.namedWindow("CaptureFace")
这行代码创建了一个名为 “CaptureFace” 的窗口,用于显示视频或摄像头捕获的图像。
3.选择输入源:
if useCamera == True:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
else:
cap = cv2.VideoCapture('视频地址')
根据 useCamera 的值选择输入源。如果 useCamera 为 True,则使用摄像头作为输入源,通过 cv2.VideoCapture(0, cv2.CAP_DSHOW) 打开默认摄像头。这里的 0 表示默认摄像头,cv2.CAP_DSHOW 是一个可能的参数,用于在某些系统上更好地显示摄像头图像。如果 useCamera 为 False,则使用指定的视频文件作为输入源,通cv2.VideoCapture(‘视频地址’) 打开视频文件。
4.加载人脸检测分类器:
classfier = cv2.CascadeClassifier('F:/pycharm/Anaconda/envs/study/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)
这里加载了 OpenCV 预训练的人脸检测分类器,路径为 ‘F:/pycharm/Anaconda/envs/study/Lib/sitepackages/cv2/data/haarcascade_frontalface_alt2.xml’。这个分类器是通过大量的人脸和非人脸图像进行训练得到的,可以快速检测图像中的人脸区域。同时,定义了一个绿色的颜色变量 color = (0, 255, 0),用于在检测到的人脸周围绘制矩形框。
注意!!!人脸分类器是你下载的Opencv的库里面自带的你只需要找到它的位置就行了。在你下载Anaconda的地址找到envs,再找你自己环境的名字然后跟着上面的路径找就可以找到。
5.循环处理每一帧:
while cap.isOpened():
flag, frame = cap.read()
frame = cv2.flip(frame, 1)
这是一个循环,只要摄像头或视频文件打开(cap.isOpened() 返回 True),就会不断读取每一帧图像。cap.read() 返回两个值,flag 表示是否成功读取帧,frame 是读取到的图像帧。如果读取成功,flag 为 True,否则为 False。frame = cv2.flip(frame, 1) 对读取到的图像帧进行水平镜像操作,参数 1 表示水平镜像。
if not flag:
break
如果读取失败(not flag),则退出循环。
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
将彩色图像 frame 转换为灰度图像 grey,因为人脸检测分类器通常在灰度图像上效果更好。
facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
使用加载的人脸检测分类器在灰度图像上进行人脸检测。detectMultiScale 方法返回一个列表,其中每个元素都是一个包含检测到的人脸区域的坐标和大小的四元组 (x, y, w, h)。参数 scaleFactor=1.2 表示图像缩放比例,minNeighbors=3 表示检测到的人脸周围的最小邻居数量,minSize=(32, 32) 表示最小的人脸尺寸。
if len(facerects) > 0:
for faceRect in facerects:
x, y, w, h = faceRect
如果检测到人脸(len(facerects) > 0),则遍历每一个检测到的人脸区域。x, y, w, h 分别表示人脸区域的左上角横坐标、纵坐标、宽度和高度。
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)
在原始图像帧 frame 上绘制一个矩形框,以标记检测到的人脸区域。参数 (x - 10, y - 10) 是矩形框的左上角坐标,(x + w + 10, y + h + 10) 是矩形框的右下角坐标,color 是矩形框的颜色(绿色),3 是矩形框的线宽。
cv2.imshow("CaptureFace", frame)
在 “CaptureFace” 窗口中显示当前处理后的图像帧。
if cv2.waitKey(10) & 0xFF == ord('q'):
break
等待用户按键,如果在 10 毫秒内没有按键按下,则继续循环。如果用户按下 ‘q’ 键(ord(‘q’) 返回字符 ‘q’ 的 ASCII 值),则退出循环。
6.释放资源和关闭窗口:
cap.release()
cv2.destroyAllWindows()
cap.release() 释放摄像头或视频文件资源。cv2.destroyAllWindows() 关闭所有打开的窗口。
完整代码
cv2
# 人脸检测函数:
# useCamera参数:True表示使用摄像头,False表示读取当前目录下视频文件
def face_detection(useCamera=True):
# 1.调用摄像头或者使用读取视频
cv2.namedWindow("CaptureFace")
if useCamera == True:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
else:
cap = cv2.VideoCapture('D:/opencvdata/video1.mp4')
# 2.人脸识别器分类器
classfier = cv2.CascadeClassifier(
'F:/pycharm/Anaconda/envs/study/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)
while cap.isOpened():
flag, frame = cap.read()
frame = cv2.flip(frame, 1) # 镜像操作
if not flag:
break
# 3.灰度转换
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 4.人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(facerects) > 0: # 大于0则检测到人脸
for faceRect in facerects: # 单独框出每一张人脸
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)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
face_detection() # 使用摄像头
face_detection(useCamera=False) # 使用视频
三、结果示例
如图是通过我的电脑摄像头检测到我的人脸。
总结
大家有任何问题都可以在评论区和私信跟我联系,互相交流学习,本人也是研一刚开始学视觉的菜鸟一枚。