·```
import cv2
def StaticDetect(filename):
‘’’
静态图像的人脸检测
‘’’
# 创建一个级联分类器,加载一个 .xml文件,它既可以是Haar特征,也可以是LBP特征的分类器
face_casecade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
# 加载图像
img = cv2.imread(filename, cv2.IMREAD_COLOR)
# 转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
detectMultiScale进行人脸检测
传入参数为args:
img:传入图像
object:被检测的物体的矩形框向量组
scaleFactor:表示前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口扩大10%
minNegihbors,表示构成检测目标的相邻矩形的最小个数(默认为3个)
flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数会使用Canny边缘检测来排除边缘过多或者过少的区域,这些通常不会是人脸所在区域
minSize和maxSize:用来限制得到的目标区域的范围
输出为:vector保存各个人脸的坐标、大小(用矩形表示)
'''
faces = face_casecade.detectMultiScale(gray_img, 1.2, 5)
for (x, y, w, h) in faces:
# 在原图上绘制矩形
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.namedWindow('Face_Detected')
cv2.imshow('Face_Detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def detect(filename):
# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
# 读取图片
img = cv2.imread(filename)
# 转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, 1.8, 5)
# 绘制人脸矩形框
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 命名显示窗口
cv2.namedWindow(‘people’)
# 显示图片
cv2.imshow(‘people’, img)
# 保存图片
cv2.imwrite(‘cxks.png’, img)
# 设置显示时间,0表示一直显示
cv2.waitKey(0)
def face_rec():
# 加载视频
# cameraCapture = cv2.VideoCapture(0)
cameraCapture = cv2.VideoCapture("video.mp4")
# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取数据
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1:
# 读取数据
ret, img = cameraCapture.read()
# 进行人脸检测
# 1.image表示的是要检测的输入图像
# 2.objects表示检测到的人脸目标序列
# 3.scaleFactor表示每次图像尺寸减小的比例
# 4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
# 5.minSize为目标的最小尺寸
# 6.minSize为目标的最大尺寸
faces = face_cascade.detectMultiScale(img, 1.3, 1, cv2.CASCADE_FIND_BIGGEST_OBJECT, (500, 500), (1000, 1000))
if len(faces) > 0:
print("have body")
# 绘制矩形框
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 设置显示窗口
cv2.namedWindow('camera', 0)
cv2.resizeWindow('camera', 840, 480)
# 显示处理后的视频
cv2.imshow('camera', img)
# 读取数据
success, frame = cameraCapture.read()
# 释放视频
cameraCapture.release()
# 释放所有窗口
cv2.destroyAllWindows()
def face_rec_video():
# 加载视频
cameraCapture = cv2.VideoCapture(0)
# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取数据
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1:
# 读取数据
ret, img = cameraCapture.read()
# 进行人脸检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 8)
# 绘制矩形框
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 设置显示窗口
cv2.namedWindow('camera', 0)
cv2.resizeWindow('camera', 840, 480)
# 显示处理后的视频
cv2.imshow('camera', img)
# 读取数据
success, frame = cameraCapture.read()
# 释放视频
cameraCapture.release()
# 释放所有窗口
cv2.destroyAllWindows()
def openvideo(window_name, video_id):
cv2.namedWindow(window_name) # 创建一个窗口
cap = cv2.VideoCapture(video_id) # 获取摄像头
while cap.isOpened():
ok, frame = cap.read() # ok表示摄像头读取状态,frame表示摄像头读取的图像
if not ok:
break
cv2.imshow(window_name, frame) # 将图像矩阵显示在一个窗口中
c = cv2.waitKey(25) # 等待10ms,10ms内没有按键操作就进入下一次while循环,从而得到10ms一帧的效果,waitKey返回在键盘上按的键
if c & 0xFF == ord('q'): # 按键q后break
break
# 释放资源
cap.release()
cv2.destroyWindow(window_name)
print("cam closed")
if name == ‘main’:
# openvideo(‘mycam’, 0)
# face_rec()
face_rec_video()