人脸检测模型文件
进入网址后点击下载即可
在图像上绘制一个简单的矩形
参数:
img:要划的线所在的图像;
pt1: 左上顶点
pt2: 右下顶点
color:边框的颜色
thickness=1:线条粗细,默认是1.如果一个闭合图形设置为-1,那么整个图形就会被填充。
line_type:int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。
shift:int类型的shift,该数值可以控制箭头的长度和位置,比如当其为1时,箭头的位置变为原先的1/2,长度也变为1/2,若该数值为2,则均变为原先的1/4。我猜测数值X和缩放的比例关系应该是2的X次方的倒数。
原图:
import cv2 as cv
import numpy as np
if __name__ == '__main__':
img = cv.imread('image/img_14.png')
# 读取模型文件
face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
"""
参数1:image–待检测图片,一般为灰度图像加快检测速度;
参数2:objects–被检测物体的矩形框向量组;
参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。(默认为1.1)即每次搜索窗口依次扩大10%,该值越大计算的越快,人脸检测也越差;
参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
"""
faces= face.detectMultiScale(img,scaleFactor=1.2,minNeighbors=2)
print(faces)
# 进行人脸画框
for x,y,w,h in faces:
cv.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果图展示:
人脸已经识别出来了对不对,接下来就是在识别人脸的基础上,附上马赛克
结合上面的人脸检测,制作人脸马赛克
import cv2 as cv
import numpy as np
if __name__ == '__main__':
img = cv.imread('image/img_14.png')
# 读取模型文件
face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
"""
参数1:image–待检测图片,一般为灰度图像加快检测速度;
参数2:objects–被检测物体的矩形框向量组;
参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。(默认为1.1)即每次搜索窗口依次扩大10%,该值越大计算的越快,人脸检测也越差;
参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
"""
# 执行模型,左上顶点(x,y)和w(宽),h(高)
faces= face.detectMultiScale(img,scaleFactor=1.2,minNeighbors=2)
print(faces)
"""
[[290 17 70 70]
[566 67 59 59]
[ 35 77 62 62]
[440 61 75 75]
[129 60 60 60]]
"""
# 进行人脸画框
for x,y,w,h in faces:
# 获取人脸的位置
frameBox = img[y:y + h, x:x + w]
# 缩小十倍
frameBox = frameBox[::10, ::10]
# x轴和y轴同时拉伸10倍,回复原来的大小
frameBox = np.repeat(frameBox, 10, axis=0)
frameBox = np.repeat(frameBox, 10, axis=1)
# 获得原脸框的宽高
a, b = img[y:y + h, x:x + w].shape[:2]
# 让马赛克的宽高与原脸宽的宽高一样,不让会报错
img[y:y + h, x:x + w] = frameBox[:a, :b]
# 绘制脸宽矩形
# cv.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果图展示:
图片马赛克我们会了,那如果是动态的视频呢,又该怎么打马赛克呢?
VideoCapture()
是用于从视频文件、图片序列、摄像头捕获视频的类;
VideoCapture()
中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频 ,
(1)ret,frame = cap.read()
cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
(2)cap.isOpened()
摄像头初始化,返回true则成功
import cv2 as cv
import numpy as np
if __name__ == '__main__':
# 实例化控制摄像头的类
cap = cv.VideoCapture(0)
# cap = cv.VideoCapture("视频文件路径")
# cap.isOpened() 摄像头初始化,返回true则成功
while cap.isOpened():
# 读取一帧图像,ret :是否读取正确 , frame : 读取的图像
ret,frame = cap.read()
# 加载模型文件
face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
# 执行模型,左上顶点(x,y)和w(宽),h(高)
faces = face.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4)
# 循环遍历识别到的每一张人脸数据
for x, y, w, h in faces:
# 在人脸上加马赛克
frameBox = frame[y:y+h,x:x+w]
frameBox = frameBox[::10,::10]
frameBox = np.repeat(frameBox,10,axis=0)
frameBox = np.repeat(frameBox, 10, axis=1)
a,b = frame[y:y + h, x:x + w].shape[:2]
frame[y:y + h, x:x + w] = frameBox[:a,:b]
# 在人脸周围画框
cv.rectangle(frame, (x, y), (x + w, y + h), [0, 0, 255], 2)
# 展示照片
cv.imshow('frame', frame)
# 1ms 读取一帧
k = cv.waitKey(1)
print(k)
# 按“q”退出
if k == ord('q'):
break
cv.destroyAllWindows()
效果图展示:
没有效果图!!!!!
还是蛮好玩的,大家也可以试一下!!!