opencv实现视频人脸识别
通过对图片的人脸识别延伸到对视频中的人脸进行识别并用矩形框进行标注
一. 实现指定图像的人脸识别
注意:
以下实例参考《OpenCV轻松入门面向Python》李立宗著,使用python语言,编辑器为PyCharm,且都运行成功。
1.dface3.jpg图片文件和当前代码放在同一级目录下。
2.级联分类器文件和当前代码文件放在同一目录下。
3.获取级联分类器方式:
1)安装opencv后,在其安装目录下的data文件夹内查找xml文件。
2)直接在网络上找到相应的XML文件,下载并使用。
访问opencv官网: https://opencv.org/ ,点进Github,在data目录下haarcascade文件夹下寻找需要的级联分类器。
代码如下:
import cv2
#读取待检测的图像
image=cv2.imread('dface3.jpg')
#加载了一个训练好的人脸检测器(xml文件,包含了用于人脸检测的哈尔特征级联分类器)
faceCascade=cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
#将图像转换成灰度图像
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#调用detectMultiScale()函数在灰度图像上检测人脸,函数会返回一个列表,每个表示一个检测到的人脸
faces=faceCascade.detectMultiScale(
gray,
scaleFactor=1.15,
minNeighbors=5,
minSize=(5,5)
)
print(faces)
print("发现{0}个人脸!".format(len(faces)))
#在原始图像上绘制矩形框,框出检测到的人脸
for(x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)
cv2.imshow("tect",image)
cv2.imwrite("re.jpg",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
detectMultiScale():
是一个用于检测目标的函数,其中包含了以下几个参数:
参数1(image):需要进行检测的输入图像,通常是灰度图像。
参数2(scaleFactor):在每个图像尺度上进行尺度变换时的缩放比例。这个参数用于多尺度检测,允许算法检测不同尺寸的目标。例如,如果设置为 1.1,意味着算法会逐渐缩小图像的尺寸进行检测。
参数3(minNeighbors):每个候选矩形应该保留的邻近数。这个参数可以帮助去除一些虚假的检测结果。较大的值会导致更少的检测框,但是这些检测框更可能是真实的目标。
参数4(minSize):目标的最小尺寸。只有大于等于这个尺寸的目标才会被检测到。这个参数可以用于排除一些小目标,以减少虚假检测。
参数5(flags):它是一个可选的参数,用于调整算法的行为。通常情况下,我们可以使用默认值0。
返回值:这个函数返回一个矩形列表,表示检测到的目标的位置和大小。通常情况下,每个矩形都是一个四元组 (x, y, width, height),分别表示目标左上角的坐标以及目标的宽度和高度。
cv2.rectangle()
是 OpenCV 库中用于在图像上绘制矩形的函数,其中包含几个参数:
image:需要绘制矩形的图像,通常是一个 NumPy 数组表示的图像对象。
pt1:矩形的左上角坐标,是一个元组 (x1, y1),其中 x1 是矩形左上角的横坐标,y1 是矩形左上角的纵坐标。
pt2:矩形的右下角坐标,也是一个元组 (x2, y2),其中 x2 是矩形右下角的横坐标,y2 是矩形右下角的纵坐标。(x+w, y+h) 是矩形框的右下角坐标,x+w 表示矩形右边界的横坐标,y+h 表示矩形底边界的纵坐标。
color:矩形的颜色,通常以 BGR 格式表示,即一个包含三个整数值的元组 (B, G, R),其中 B、G、R 分别代表蓝色、绿色、红色的通道值。(0, 255, 0) 表示纯绿色。
thickness:矩形的线条宽度,以像素为单位。如果指定为负值,表示填充整个矩形区域。默认为1。
lineType:线条类型,默认为8连接线。你可以选择不同的线条类型,如8连接、4连接等。
shift:偏移量,默认为0。这个参数通常不需要指定,除非你需要对图像进行一些特殊处理。
二. 捕获摄像头视频
opencv通过从cv2.VideoCapture提供了非常方便的捕获摄像头视频的方法。
代码如下:
import cv2
#从指定的设备中获取视频流
cap=cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('frame',frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
cv2.VideoCapture()
参数为 0,代表使用默认的摄像头设备(通常是计算机上内置的摄像头),如果你有多个摄像头,可以通过不同的参数值来选择不同的摄像头。例如,cv2.VideoCapture(1) 表示选择第二个摄像头。也可以传入视频文件的路径作为参数,以便从文件中读取视频流。
三.实现视频人脸识别
代码如下:
import cv2
import numpy as np
#创建了一个VideoCapture对象cap用于捕获视频,0表示打开默认的摄像头
cap=cv2.VideoCapture(0)
#加载人脸识别检测器
faceCascade=cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
#只要摄像头处于打开状态就一直运行
while(cap.isOpened()):
#使用read方法从摄像头捕获一帧,ret是个布尔值表示是否成功读取帧,frame是捕获的视频帧
ret,frame=cap.read()
if ret:
#对每个帧进行解析
#将每一帧转换为灰度图像
gray_image=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces=faceCascade.detectMultiScale(
gray_image,
scaleFactor=1.15,
minNeighbors=5,
minSize=(5,5)
)
#逐个标注检测到的人脸
for(x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+w),(0,255,0),2)
cv2.imshow("detect",frame)
#按esc键控制退出
c=cv2.waitKey(1)
if c==27:
break
else:
break
cap.release()
cv2.destroyAllWindows()
更多推荐
所有评论(0)