Opencv的人脸检测函数,定义了具体可跟踪对象类型的数据文件。
Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配。
两个图像的相似程度可以通过它们对应特征的欧式距离来度量。距离可能以空间坐标或颜色坐标来定义。类Haar特征是一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。例如,边,顶点和细线都能生成具有判断性的特征。
Haar级联级具有尺度不变性,换句话说,它在尺度变化上具有鲁棒性。但是,opencv的Haar级联不具有旋转不变性。
在opencv源代码的副本中会有一个文件夹data/haarcascades,该文件夹包括了所有opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。
在开始写代码之前,先要下载opencv源代码包:
import cv2 as cv
# 人脸检测
def face_image():
# 转灰度图
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier("opencv-3.3.1/data/haarcascades/haarcascade_frontalface_alt_tree.xml")
faces = face_detector.detectMultiScale(gray, 1.02, 5) # 第二个参数是移动距离,第三个参数是识别度,越大识别读越高
for x, y, w, h in faces:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 0, 255), 2) # 后两个参数,一个是颜色,一个是边框宽度
cv.imshow("result", src)
# 摄像头人脸检测
def face_image(src):
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier("haarcascade_frontalface_alt_tree.xml")
faces = face_detector.detectMultiScale(gray, 1.02, 5) # 第二个参数是移动距离,第三个参数是识别度,越大识别读越高
for x, y, w, h in faces:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 0, 255), 2) # 后两个参数,一个是颜色,一个是边框宽度
cv.imshow("result", src)
if __name__ == '__main__':
'''
人脸检测
'''
src = cv.imread("data/lena.jpg")
cv.imshow("original", src)
face_image()
cv.waitKey(0)
cv.destroyAllWindows()
'''
摄像头人脸检测
'''
capture = cv.VideoCapture(0)
while (True):
ret, frame = capture.read()
frame = cv.flip(frame, 1)
face_image(frame)
if cv.waitKey(10) & 0xFF == ord('q'): # 键盘输入q退出窗口,不按q点击关闭会一直关不掉 也可以设置成其他键。
break
face_image()
cv.waitKey(0)
cv.destroyAllWindows(