回顾,上节课我们学了什么?
#实例化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)
版权归原作者 ζั͡ ั͡雾 ั͡狼 ั͡✾ 所有, 如有侵权,请联系我们删除。