调用OpenCV训练好的分类器和自带的检测函数检测人脸
步骤
- 加载分类器
- 调用detectMultiScale()函数检测,调整函数的参数可以使检测结果更加精确
- 把检测到的人脸用矩形画出来
主要函数:
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4.minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
适当调整4,5,6两个参数可以用来排除检测结果中的干扰项。
python程序:
import cv2
import numpy as np
# 使用opencv进行面部检测
def mk_face(imgPath):
# 加载面部 分类器
face_cacsde = cv2.CascadeClassifier(
'./data/haarcascades/haarcascade_frontalface_default.xml')
# 加载眼部 分类器
eye_cacsde = cv2.CascadeClassifier(
'./data/haarcascades/haarcascade_eye.xml')
# 读取照片
img = cv2.imread(imgPath)
# 将BGR颜色转换为GRAY
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测面部 参数:1, 待检测的输入图像。2,检测到的人脸目标序列。3,每次图像尺寸减少的比例
# 4,每一个目标至少要被检测到3次才算是真的目标.5,目标的最小尺寸. 6,目标的最大尺寸
faces = face_cacsde.detectMultiScale(
gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (50, 50), (100, 100))
if len(faces) > 0:
for faceRect in faces:
x, y, w, h = faceRect
# 画一个绿色矩形
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2, 8, 0)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# 识别人眼
eyes = eye_cacsde.detectMultiScale(
roi_gray, 1.1, 1, cv2.CASCADE_SCALE_IMAGE, (2, 2))
# 画人眼的矩形
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(
roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def main():
mk_face('./data/7.jpg')
pass
if __name__ == '__main__':
main()