之前我们用11次分解学习实现了一个简单的人脸识别项目,现将11次记录和过程中涉及到的代码进行记录方便之后复习~
一、系列导航:
建筑兔零基础自学python记录12|实战人脸识别项目——读取图片01-CSDN博客
建筑兔零基础自学python记录13|实战人脸识别项目——灰度转换02-CSDN博客
建筑兔零基础自学python记录14|实战人脸识别项目——尺寸修改03-CSDN博客
建筑兔零基础自学python记录15|实战人脸识别项目——绘制矩形04(附:常见BGR值列表)-CSDN博客
建筑兔零基础自学python记录16|实战人脸识别项目——人脸检测05-CSDN博客
建筑兔零基础自学python记录17|实战人脸识别项目——多人合照人脸检测06-CSDN博客
建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07_人脸识别项目实战-CSDN博客建筑兔零基础自学python记录19|实战人脸识别项目——人脸录入08-CSDN博客建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07_人脸识别项目实战-CSDN博客
建筑兔零基础自学python记录20|实战人脸识别项目——数据训练09-CSDN博客
建筑兔零基础自学python记录21|实战人脸识别项目——视频人脸识别(上)10-CSDN博客
建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11-CSDN博客
二、代码整理复习:
(1)cv.waitKey()等待
cv.waitKey()
:等待键盘事件的函数。- 可接受一个整数参数,表示等待的时间(单位为毫秒)。
- 如果传入的参数为 0 或不传入参数,则表示无限等待,直到用户按下键。
& 0xFF
操作:
&
是按位与运算符,0xFF
是十六进制数。& 0xFF含义是只保留低 8 位数。
#等待方法1
#cv.waitKey()
#等待方法2
while True:
if ord('q')==cv.waitKey(0):
break
按键S
k = cv2.waitKey(1) & 0xFF
if k == ord('s'):
(2)cv.destroyAllWindows()释放内存
(3)img=cv.imread('face1.png')读取图片
(4)cv.imshow('read_img_123hello',img)显示图片
(5)cv.imwrite('gray_toto11.png',gray_img)存图片
(6)gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)灰度转换
(7)print()控制台输出
print('Hello, World!')
age = 25
print(age)
name = 'Alice'
age = 25
print(name, age)
(8)cv.resize()命令
resize_img=cv.resize(img,dsize=(512,512))
cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
resized_img = cv.resize(img, None, fx=0.5, fy=0.5)
- src:输入图像,一般就是img的图名。
- dsize:输出图像的大小,必须是一个元组 (水平向,垂直向)的形式
- dst(可选):输出图像,与输入图像具有相同的类型和通道数。
- fx(可选):沿水平轴的缩放因子。
- fy(可选):沿垂直轴的缩放因子。
- interpolation(可选):插值方法,调整图像大小时处理像素值的计算方法。
(8)BGR值表
(9)cv.rectangle(左上角,右下角) 画矩形
cv.rectangle(img, pt1, pt2, color, thickness=None)
(10)cv.circle(圆心,半径)画圆
cv.circle(img, center, radius, color, thickness=None)
(11) cv.CascadeClassifier()人脸识别分类器
face_detect = cv.CascadeClassifier('M:/python/pythoninstall/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
(12)detectMultiScale
()图像中检测对象
detectMultiScale(image, scaleFactor=1.1, minNeighbors=3, flags=0, minSize=(0, 0), maxSize=(0, 0))
- image:必需参数,输入的待检测图像,通常是灰度图像。
- scaleFactor:可选参数,默认值为 1.1。该参数表示在每个图像尺度上图像缩小的比例。例如,scaleFactor = 1.1 表示每次将图像缩小 10% 进行检测。较大的值会加快检测速度,但可能会遗漏一些对象;较小的值会增加检测时间,但可能会提高检测的准确性。
- minNeighbors:可选参数,默认值为 3。该参数表示每个候选矩形框应该保留的最小邻居数。这个参数用于控制误检测的情况,值越大,检测到的对象越可能是真实的对象,但可能会遗漏一些真实的对象;值越小,可能会检测到更多的对象,但误检测的可能性也会增加。
- flags:可选参数,在较新的 OpenCV 版本中,这个参数的作用不大,通常保持默认值 0 即可。
- minSize:可选参数,默认值为 (0, 0)。该参数指定检测对象的最小尺寸,如果检测到的对象小于这个尺寸,则会被忽略。
- maxSize:可选参数,默认值为 (0, 0)。该参数指定检测对象的最大尺寸,如果检测到的对象大于这个尺寸,则会被忽略。
(13)cv.VideoCapture()视频路径
#举例:
#(1)导入视频路径
cap = cv.VideoCapture('http://example.com/stream.m3u8')
cap = cv.VideoCapture('path/to/your/video.mp4')
#(2)导入摄像头
cv.VideoCapture(0)
(14)flag,frame=cap.read()读取视频
返回值——
flag:读帧与否,frame:帧
(15)import os
导入与操作系统进行交互的功能
适用于所有支持 Python 的操作系统,包括 Windows、Linux、macOS 等。
(16)from PIL import Image:Python Imaging Library(Pillow)导入 Image 类处理图像文件
注:前提命令相当于import
补充:from PIL import Image和import cv2都是图像处理的库。区别在于PIL(Pillow)更早,主要用于基础的图像操作。而 OpenCV适用于更复杂的视觉任务。
PIL(Pillow)支持常见的图像读取、保存、裁剪、缩放、旋转、颜色模式转换等操作。/支持多种图像格式,如 JPEG、PNG、BMP 等,方便在不同格式之间进行转换。
OpenCV支持图像滤波、边缘检测、特征提取(如 SIFT、SURF、ORB 等)、目标检测(如 Haar 级联分类器、HOG + SVM)、图像分割、运动分析等操作。例如:用 Haar 级联分类器进行人脸检测。/支持视频的读取、写入和处理,可用于视频分析、视频监控等领域。
(17)convert() 是 Pillow 库中将图像从一种模式转换为另一种模式
PIL_img=Image.open(imagePath).convert('L')
- '1':转换为 1 位像素的二值图像,即每个像素只能是 0(黑色)或 255(白色)。
- 'L':转换为 8 位像素的灰度图像。
- 'RGB':转换为 3 通道的真彩色图像。
- 'RGBA':在 RGB 的基础上增加了一个透明度通道(Alpha)。
- 'CMYK':转换为四通道的印刷色彩模式。
(18)np.array()
函数主要用于创建 NumPy
数组
#np.array()将 Pillow 图像转换为 numpy 数组
img_numpy=np.array(PIL_img,'uint8')
(19) if __name__ == '__main__'
主函数
(20)Haar属于分类器,LBPH属于识别器

(21)recogizer.predict( )识别输入人脸进行判断输出
#加载已训练的人脸识别器recogizer对人脸区域进行识别,得到标签ids和置信度评分confidence
ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
- 标签 ID(ids):它是一个整数,代表识别出的人脸对应的预定义标签。
- 置信度评分(confidence):它是一个浮点数,用于衡量识别结果的可靠程度。置信度评分越低表示识别结果越可靠。在 LBPH 算法中,置信度评分通常在 0 到 200 之间,通常会设定一个阈值(如 80)来判断识别结果是否可信。如果置信度评分高于阈值,则认为识别结果不可靠,可能是未知人脸。
(22)对比EigenFaces 、FisherFaces(最好)和LBPH分类器(最少)
(23)+= 复合赋值运算符
warningtime += 1
等价于 warningtime = warningtime + 1
(24)全局变量和局部变量
全局变量从程序开始时创建,直到程序结束时才被销毁。整个运行过程中一直存在于内存中。
局部变量从其所在的函数、类或代码块被调用时开始创建,当执行结束后,所占用的内存会被释放,即局部变量被销毁。
举例:在函数内部可以直接访问全局变量
要修改全局变量的值,需要使用 global 关键字进行声明
(25) cv2.putText ()在图像上绘制文本
#cv2.putText(图片, 文本, 坐标, 字体,大小, 颜色)
cv2.putText(img, text, org, fontFace, fontScale, color)
(26)str( )将对象转换为字符串/int()float()字符串转换为对象
(27)OpenCV坐标移动规律:+ 号撒腿右下跑,- 号转身左上飘
(28)os.path.join()协调文件路径中/\差异
(29)os.listdir()输出某目录下所有文件名
例如os.listdir(path)获得了['
1.lss.jpg', '
2.lss.jpg']
(30)
os.path.split()将一个文件路径拆分为目录部分和文件名部分
(31)split()
将字符串按照指定的分隔符分割成多个子字符串,并返回一个包含这些子字符串的列表
(32)元组和字符串的索引都是从 0 开始
即[0]代表首位,[1]代表第二个
(33)append()
在列表的末尾添加一个新元素
list.append(object)
list
:表示要操作的列表对象。object
:表示要添加到列表末尾的任意 Python 对象,比如字符串、整数、列表、元组等。