回顾,上节课我们学了什么?
#实例化fast
fast=cv.FastFeatureDetector_create(threshold,nonMaxSuppression)
#检测关键点,没有关键点描述
kp=fast.detect(gray,None)
#关键点检测结果绘制到图像上面
cv.drawKeypoints(img,keypoints,outputimg,flags)
#实例化orb
orb=cv.ORB_creat(nfeatures)
#检测关键点并计算
kp,des=orb.detectAndCompute(gray,None)
#关键点检测结果绘制到图像上面
cv.drawKeypoints(img,keypoints,outputimg,flags)
1.原理:
我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。
Haar特征(这个值等于黑色矩形中的像素值之后减去白色矩形中的像素值和。)会被使用,就像我们的卷积核,每一个特征是一个值。
Haar特征值反映了图像的灰度变化情况。
Haar特征可用于于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征。
然后训练决策树判断是不是人脸
2.代码API
OpenCV中自带已训练好的检测器,包括面部,眼睛,猫脸等,都保存在XML文件中,我们可以通过以下路径找到他们。
opencv自带训练集就这么多,如果想识别其他物体的,需要自己建立训练集
#加载分类器
cascade = cv.CascadeClassifier("训练集路径")
cascade.load("训练集路径")
#调用识别
set = cascade.detectMultiScale(gray,scaleFact, minNeighbors,minSize,flags)
set:返回的搜素矩形框集合,每个参数为(x,y,宽w,高h)
gray:灰度图
scaleFact:表示在前后两次相继的扫描中,搜索窗口的比例系数
minSIze:最小尺寸
minNeighbors:
匹配成功所需要的周围矩形框的数目,只有多个矩形框同时存在的时候,才认为是匹配成功,人脸默认3
flags:
CASCADE_DO_CANNY_PRUNING=1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域
CASCADE_SCALE_IMAGE=2, 正常比例检测
CASCADE_FIND_BIGGEST_OBJECT=4, 只检测最大的物体
CASCADE_DO_ROUGH_SEARCH=8 初略的检测
举例
#11.1
import cv2 as cv
import matplotlib.pyplot as plt
#解决中文显示问题,固定格式,直接复制下面俩行代码就行
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 加载分类器
face_cascade = cv.CascadeClassifier("./venv/Lib/site-packages/cv2//data/haarcascade_frontalface_default.xml")
face_cascade.load("./venv/Lib/site-packages/cv2//data/haarcascade_frontalface_default.xml")
# 读取灰度图片
pic1 = cv.imread("face.jpg")
gray = cv.cvtColor(pic1,cv.COLOR_BGR2GRAY)
# 探测图片中的人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (5 ,5),
)
#绘制矩形
pic2=pic1.copy()
for (x,y,w,h) in faces:
cv.rectangle(pic2,(x,y),(x+h,y+w),(0,0,255),5)
#绘图
fig,axes=plt.subplots(nrows=1,ncols=2)
axes[0].imshow(pic1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(pic2[:,:,::-1])
axes[1].set_title("识别")
plt.show()
cv.waitKey()
结果
总结,这节课我们学了什么?
#加载分类器
cascade = cv2.CascadeClassifier("训练集路径")
cascade.load("训练集路径")
#调用识别
set = cascade.detectMultiScale(gray,scaleFact, minNeighbors,minSize,flags)
版权归原作者 ζั͡ ั͡雾 ั͡狼 ั͡✾ 所有, 如有侵权,请联系我们删除。