python手势检测 cascade_python基于opencv实现人脸识别

本文介绍了如何利用Python和OpenCV库进行手势检测和人脸识别。通过加载预训练的Haarcascade分类器,对图像和视频帧进行灰度处理后,运用detectMultiScale方法检测人脸。代码示例展示了在图像、视频及摄像头实时流中应用该技术的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别。

识别图像中的人脸

#coding:utf-8

import cv2 as cv

# 读取原始图像

img = cv.imread('face.png')

# 调用熟悉的人脸分类器 识别特征类型

# 人脸 - haarcascade_frontalface_default.xml

# 人眼 - haarcascade_eye.xml

# 微笑 - haarcascade_smile.xml

face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 检查人脸 按照1.1倍放到 周围最小像素为5

face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

print ('识别人脸的信息:',face_zone)

# 绘制矩形和圆形检测人脸

for x, y, w, h in face_zone:

# 绘制矩形人脸区域 thickness表示线的粗细

cv.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,0,255], thickness=2)

# 绘制圆形人脸区域 radius表示半径

cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)

# 设置图片可以手动调节大小

cv.namedWindow("Easmount-优快云", 0)

# 显示图片

cv.imshow("Easmount-优快云", img)

# 等待显示 设置任意键退出程序

cv.waitKey(0)

cv.destroyAllWindows()

d9224c585280e9e8a1e6345d738acf82.png

注意,此算法只能检测正脸,并且任何算法都有一定的准确率。如上图所示,图像中有一处被错误地检测为人脸。

CascadeClassifier:

是OpenCV中人脸检测的一个级联分类器,既可以使用Haar,也可以使用LBP特征。以Haar特征分类器为基础的对象检测技术是一种非常有效的技术。它是基于机器学习且使用大量的正负样本训练得到分类器。

Haar-like矩形特征:

是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。

LBP:

是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。比如:cv.face.LBPHFaceRecognizer_create()。

detectMultiScale:

检测人脸算法,其参数:

– image表示要检测的输入图像

– objects表示检测到的人脸目标序列

– scaleFactor表示每次图像尺寸减小的比例

– minNeighbors表示每一个目标至少要被检测到3次才算是真的目标,因为周围的像素和不同的窗口大小都可以检测到人脸

– minSize表示目标的最小尺寸

– maxSize表示目标的最大尺寸

识别视频中的人脸

将视频中每一帧图像取出,进行图像人脸识别,标记识别到的人脸,显示每一帧图像。

#coding:utf-8

import cv2 as cv

import numpy as np

# 加载视频

cap = cv.VideoCapture('wang.mp4')

# 调用熟悉的人脸分类器 识别特征类型

# 人脸 - haarcascade_frontalface_default.xml

# 人眼 - haarcascade_eye.xm

# 微笑 - haarcascade_smile.xml

face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')

while True:

# 读取视频片段

flag, frame = cap.read()

if flag == False:

break

# 灰度处理

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# 检查人脸 按照1.1倍放到 周围最小像素为5

face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.5, minNeighbors = 8)

# 绘制矩形和圆形检测人脸

for x, y, w, h in face_zone:

cv.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)

cv.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)

# 显示图片

cv.imshow('video', frame)

# 设置退出键和展示频率

if ord('q') == cv.waitKey(25):

break

# 释放资源

cv.destroyAllWindows()

cap.release()

c1f0049d64c49317cb6b2c4dfaf393fb.gif

识别摄像头中的人脸

#coding:utf-8

import cv2 as cv

# 识别电脑摄像头并打开

cap = cv.VideoCapture(0)

# 调用熟悉的人脸分类器 识别特征类型

# 人脸 - haarcascade_frontalface_default.xml

# 人眼 - haarcascade_eye.xm

# 微笑 - haarcascade_smile.xml

face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')

while True:

# 读取视频片段

flag, frame = cap.read()

if flag == False:

break

# 灰度处理

gray = cv.cvtColor(frame, code=cv.COLOR_BGR2GRAY)

# 检查人脸 按照1.1倍放到 周围最小像素为5

face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1, minNeighbors = 5)

# 绘制矩形和圆形检测人脸

for x, y, w, h in face_zone:

cv.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)

cv.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)

# 显示图片

cv.imshow('video', frame)

# 设置退出键和展示频率

if ord('q') == cv.waitKey(40):

break

# 释放资源

cv.destroyAllWindows()

cap.release()

以上就是python基于opencv实现人脸识别的详细内容,更多关于python opencv 人脸识别的资料请关注脚本之家其它相关文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值