OpenCV完整代码
import cv2 as cv
import matplotlib
import matplotlib.pyplot as plt
# 设置字体为楷体
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
patha='D:\ProgramData\Anaconda3\envs\demo1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml'
pathb='D:\ProgramData\Anaconda3\envs\demo1\Lib\site-packages\cv2\data\haarcascade_eye.xml'
# 读取图片
img = cv.imread("16.jpg")
# 转化为灰度图
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2.实例化OpenCV人脸和眼睛检测的分类器
face_cas = cv.CascadeClassifier(patha)
face_cas.load(patha)
eyes_cas = cv.CascadeClassifier(pathb)
eyes_cas.load(pathb)
# 3.调用识别人脸
# gray要进行检测的人脸图像, scaleFactor前后两次扫描中搜索窗口的比例系数, minneighbors目标至少# 被检测次数才会认为是目标,minSize与maxSize用来限制目标的最小尺寸与最大尺寸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
# 如果有多个人脸每个都检测一遍
for faceRect in faceRects:
# 当前人脸位置
x, y, w, h = faceRect
# 框出人脸
cv.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 3)
# 4.在识别出的人脸中进行眼睛的检测
roi_color = img[y:y + h, x:x + w]
roi_gray = gray[y:y + h, x:x + w]
eyes = eyes_cas.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
# 5.检测结果的绘制
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title('检测结果')
plt.xticks([]), plt.yticks([])
plt.show()
使用函数cv2.imread(filepath,flags)读入一副图片(BGR格式),括号中可以只写路径
filepath:要读入图片的完整路径
flags:读入图片的标志
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。
CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。
子函数detectMultiScale()介绍
void detectMultiScale(
const Mat& image, //待检测图像
CV_OUT vector<Rect>& objects, //被检测物体的矩形框向量
double scaleFactor = 1.1, //前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%
int minNeighbors = 3, //构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除
//如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框
int flags = 0, //若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域
Size minSize = Size(),
Size maxSize = Size() //最后两个参数用来限制得到的目标区域的范围
);