0


[图像识别]12.Opencv案例 超简单人脸检测识别

回顾,上节课我们学了什么?

#实例化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)


本文转载自: https://blog.csdn.net/qq_54263076/article/details/127155374
版权归原作者 ζั͡ ั͡雾 ั͡狼 ั͡✾ 所有, 如有侵权,请联系我们删除。

“[图像识别]12.Opencv案例 超简单人脸检测识别”的评论:

还没有评论