【时间】2018.09.21
【题目】使用openCV进行人脸检测(python)
【参考链接】本文来自 冰不语 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xingchenbingbuyu/article/details/51105159?utm_source=copy,在此基础上进行补充,修正
【步骤】 调用opencv训练好的分类器和自带的检测函数检测人脸人眼等的步骤简单直接:
1.加载分类器,当然分类器事先要放在工程目录中去。分类器本来的位置是在*\opencv\sources\data\haarcascades(harr分类器,也有其他的可以用,也可以自己训练)
2.调用detectMultiScale()函数检测,调整函数的参数可以使检测结果更加精确。(人脸检测)
3.把检测到的人脸等用矩形(或者圆形等其他图形)画出来。 (使用分类器+检测器后,还得自己得把人脸框出来)
【主要函数】
这里面最主要的一个函数就是detectMultiScale()。文档中的解释如下:
C++函数中:
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.maxSize为目标的最大尺寸 适当调整4,5,6两个参数可以用来排除检测结果中的干扰项。
【 程序 】
import numpy as np
import cv2
# 注意要使用绝对路径,用/或者\\
face_cascade = cv2.CascadeClassifier("C:\\Users\\Administrator\\Desktop\\code\\ASFace\\preprocess\\haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier("C:\\Users\\Administrator\\Desktop\\code\\ASFace\\preprocess\\haarcascade_eye_tree_eyeglasses.xml")
img = cv2.imread("C:\\Users\\Administrator\\Desktop\\code\\ASFace\\preprocess\\02.jpg")
# 转换图片的色彩空间
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.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_cascade.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.cvtColor(img,cv2.COLOR_BGR2GRAY) :opencv中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8种,使用中经常要遇到色彩空间的转化,以便生成mask图等操作。openCV的默认色彩空间是BGR。
-
分类器以及图片的位置用使用绝对路径,用/或者\\隔开
【运行结果】