1.原理
以Haar 特征分类器为基础的对象检测技术是一种非常有效的对象检测技术(2001 年Paul_Viola 和Michael_Jones 提出)。它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测。
2.opencv中的Haar分类器
OpenCV 自带了训练器和检测器。OpenCV 已经包含了很多已经训练好的分类器,其中包括:面部,眼睛,微笑等。这些XML 文件保存在/opencv/data/haarcascades/文件夹中。
代码速记:
- cv2.CascadeClassifier()
- face_cascade.detectMultiScale()
- eye_cascade.detectMultiScale()
参数解释:
cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
- scaleFactor :指定每个图像比例缩小多少
- minNeighbors: 指定每个候选矩形必须保留多少个邻居。
- minSize:最小可能的对象大小。小于此值的对象将被忽略。
- maxSize:最大可能的对象大小。大于此值的对象将被忽略。
- 函数功能:检测输入图像中不同大小的对象。
- 返回值:检测到的对象将作为Rect对象返回。
实战:
def classify(self):
copy=self.img.copy()
#【1】加载XML分类器
face_cascade = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_eye.xml')
#【2】以灰度格式加载输入图像或视频
gray = cv2.cvtColor(copy, cv2.COLOR_BGR2GRAY)
#【3】在图像中检测面部。如果检测到面部,会返回面部所在区域Rect(x,y,w,h)。
# 一旦获得这个位置,我们可以创建一个ROI并在其中进行眼部检测。
faces = face_cascade.detectMultiScale(gray, 1.3, 5)#img、ScaleFactor、minNeighbors
for (x, y, w, h) in faces:
#画脸(彩色图像)
copy = cv2.rectangle(copy, (x, y), (x + w, y + h), (255, 0, 0), 2)
#确定脸部ROI
roi_gray = gray[y:y + h, x:x + w]
roi_color = copy[y:y + h, x:x + w]
#【4】检测眼睛(灰度图像)
eyes = eye_cascade.detectMultiScale(roi_gray)#img、ScaleFactor、minNeighbors
for (ex, ey, ew, eh) in eyes:
#画眼睛(彩色图像)
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
titles = ['raw', 'faces&eyes']
imgs = [self.img,copy]
for i in range(2):
plt.subplot(1, 2, i + 1), plt.imshow(cv2.cvtColor(imgs[i],cv2.COLOR_BGR2RGB))
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()