人脸检测
首先我们要搞清楚人脸检测中的一些概念.
人脸检测: 在一张图像中判断是否存在人脸,并找出人脸所在的位置
人脸识别: 在人脸检测的基础上,保存收集到的人脸信息,将输入人脸与保存的信息进行比对,得到该人脸具体是哪个人。
特征值: 用某种算法,找到人脸图片的特征,在人脸识别中特征值的提取有
HOG-方向梯度直方图 , HAAR-like特征 , LBP-局部二进制模式 三种方法.
分类器: 根据特征值,界定输入事物是否属于某个类别
弱分类器:分类器的正确率高于随机分类(50%),强分类器:能满足预期分类并且正确率很高的分类器.
Adaboost: 迭代算法,同一个训练集合下训练多个弱分类器,把弱分类器迭代组合成一个强分类器.
级联分类器: 将多个同类型的分类器联合起来进行推算整合,以得到符合目标的最终分类器的方法.
分类器生成及使用
一个高准确率的级联分类器的主要生成步骤如下:
1.大量样本集合,特征值的提取
2.通过adaboost 训练多个弱分类器并迭代为强分类器
3.多层级联强分类器,得到最终的级联分类器
4.这些训练流程完成之后结果以xml的方式保存起来,就是分类器文件
opencv中包含了以上的实现,并且已经存放了许多已经训练好的级联分类器,Opencv中可以直接加载这些分类器文件,并且给出了便捷的API:
- CascadeClassifier
-
参数1:image–待检测图片,一般为灰度图像加快检测速度;
-
参数2:objects–被检测物体的矩形框向量组;
-
参数3:scaleFactor–表示在前后两次相继的扫描中,图像被缩放的比例,1.1即每次缩放10% 用于检测
-
参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
- 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
- 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
- 这种设定值一般用在用户自定义对检测结果的组合程序上(使用默认值即可)
-
参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,
- 如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因为这些区域通常不会是人脸所在区域;
-
参数6、7:minSize和maxSize用来限制得到的目标区域的范围。
-
初步使用
import numpy as np
import cv2
# 读取图片
img = cv2.imread('./data/p3.png')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_default.xml')
# 检测人脸,返回矩形框数组
faces = face.detectMultiScale(gray)
# 画出检测出的人脸框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
-1
物理学家的人脸检测
### 世界物理合照图片人脸检测
img = cv2.imread('./data/322a1792fb4fd575aaf6fa809607aa82.jpg')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_alt2.xml')
# 检测人脸
faces = face.detectMultiScale(gray)
# 画出检测出的人脸框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
-1
检测眼睛
### 检测眼睛
img = cv2.imread('./data/p3.png')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建haar级联器
face = cv2.CascadeClassifier('./data/haarcascade_frontalface_default.xml')
eye = cv2.CascadeClassifier('./data/haarcascade_eye.xml')
# 检测人脸
faces = face.detectMultiScale(gray)
# 画出检测出的人脸框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 截取人脸区域,浅拷贝
roi_img = img[y: y + h, x: x + w]
# 在人脸区域内,检测眼睛 -- 限定区域,检测的更加精准
eyes = eye.detectMultiScale(roi_img)
# 框出眼睛区域
for (ox, oy, ow, oh) in eyes:
cv2.rectangle(roi_img, (ox, oy), (ox + ow, oy + oh), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
-1
车牌识别
import pytesseract
# 读取车辆图片
img = cv2.imread('./data/chinacar.jpeg')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建haar级联器
car = cv2.CascadeClassifier('./data/haarcascade_russian_plate_number.xml')
# 检测车牌
cars = car.detectMultiScale(gray)
# 框出车牌
for (x, y, w, h) in cars:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 截取出车牌区域
roi = gray[y: y + h, x: x + w]
# 进行形态学操作
# 二值化
ret, roi_bin = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 开操作:先腐蚀,后膨胀,去除噪点
kernel = np.ones(shape=(3, 3), dtype=np.uint8) # 矩形核
roi = cv2.morphologyEx(roi_bin, cv2.MORPH_OPEN, kernel, iterations=1)
print(pytesseract.image_to_string(roi, lang='chi_sim+eng', config='--psm 8 --oem 3'))
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
*G5N555
-1