这是比较简单的人脸识别,使用opencv库函数,若想了解基础opencv各种库函数点击这里
导库
import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
图像人脸识别
图片灰度+导分类器:
Haar特征分类器一般在灰度图像上运行,所以需要将原始图像转换为灰度图像。
img = cv.imread("图片地址")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_cas = cv.CascadeClassifier( "haarcascade_frontalface_default.xml" )
face_cas.load('haarcascade_frontalface_default.xml')
eyes_cas = cv.CascadeClassifier("haarcascade_eye.xml")
eyes_cas.load("haarcascade_eye.xml")
若导库FALSE看此处
调用识别人脸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
x, y, w, h = faceRect
# 框出人脸
cv.rectangle(img, (x, y), (x + h, y + w),(0,255,0), 3)
#(x, y)是矩形左上角的坐标,w和h分别是矩形的宽度和高度。
#在识别出的人脸中进行眼睛的检测
roi_color = img[y:y+h, x:x+w]
roi_gray = gray[y:y+h, x:x+w]
eyes = eyes_cas.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
一些参数的含义:
scaleFactor:
图像金字塔中相邻两层之间的比例minNeighbors:
构成检测到的面部所需的最小邻居数minSize:
面部的最小可能尺寸
绘制检测结果:
视频人脸识别
图像识别的进阶,识别视频的每一帧,识别该帧上人脸绘图
加载视频
cap = cv.VideoCapture(0)#这个是直接摄像头读取识别,需要视频0->视频地址
加载Haar特征分类器
face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
加载错误同上
while cap.isOpened():
ret, frame = cap.read()
if ret:
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 转换为灰度图像
# 调用识别人脸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
x, y, w, h = faceRect
# 框出人脸
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv.imshow("frame", frame)
# 按下'q'键退出循环
if cv.waitKey(1) & 0xFF == ord('q'):
break
不要忘记释放资源:
cap.release()
cv.destroyAllWindows()
按帧截取视频图片
video_cap = cv.VideoCapture('文件地址') # 生成读取视频对象
if not video_cap.isOpened():
print("出错!!!不能成功打开视频文件")
exit()
n = 1 # 计数
i = 0
fps =int(video_cap.get(cv.CAP_PROP_FPS)) # 获取视频的帧率
while(video_cap.isOpened):
ret, frame = video_cap.read() # 按帧读取视频
# 到视频结尾时终止
if ret is False:
break
if (n % fps== 0):
i += 1
print(f'保存第{i}张图像')
save_image_dir = os.path.join('image', f'number_{i}.jpg')
print(f'保存地址是: {save_image_dir}')
cv.imwrite(save_image_dir, frame) # 保存视频帧图像
n += 1
video_cap.release() # 释放视频对象