一. 实现指定图像的人脸识别
注意:
以下实例参考《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:breakcap.release()cv2.destroyAllWindows()
cv2.VideoCapture()
参数为 0,代表使用默认的摄像头设备(通常是计算机上内置的摄像头),如果你有多个摄像头,可以通过不同的参数值来选择不同的摄像头。例如,cv2.VideoCapture(1) 表示选择第二个摄像头。也可以传入视频文件的路径作为参数,以便从文件中读取视频流。
三.实现视频人脸识别
代码如下:
import cv2import 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:breakelse:breakcap.release()cv2.destroyAllWindows()