先来了解一下能对视频进行读取的函数videoCaptuure() 内接文件路径
video = cv2.VideoCapture('monkey.mp4')
retval, image = video.read()
对于视频来说就是将一张张图片进行逐帧的替换,当帧数达到一定程度时,人眼便不能分辨出
read()这个函数可以用两个变量来进行接受,
第一个变量是一个bool类型的值,他代表下一帧是否还有图片
第二个就是读取出来的每一张图片
马赛克处理的方式之一
face = face[::10, ::10] # 将人脸图片 每隔10个像素取出来一次
face = np.repeat(np.repeat(face, 10, axis=0),10,axis=1) # 将像素放10次 在两个方向上
np是导入的numpy包
第一个是对读取出来的人脸图片像素点进行间隔取点位
间隔取到的点 就会有部分信息的丢失
repeat函数的用法 大家可以自己了解
全部代码:
# 视频中的人脸马赛克
import cv2
import numpy as np
if __name__ == '__main__':
video = cv2.VideoCapture('monkey.mp4')
fps = video.get(propId=cv2.CAP_PROP_FPS) # 视频的帧率
width = video.get(propId=cv2.CAP_PROP_FRAME_WIDTH)
height = video.get(propId=cv2.CAP_PROP_FRAME_HEIGHT)
count = video.get(propId=cv2.CAP_PROP_FRAME_COUNT)
print("fps:", fps)
print("width:", width)
print("height:", height)
print("count:", count)
# 视频的本质是逐帧播放
face_detector = cv2.CascadeClassifier('./xml/haarcascade_frontalface_alt.xml')
while True:
retval, image = video.read() # retval 是bool型的值 读取到最后一帧 变成false
if not retval:
break
print("视频读取完成")
image = cv2.resize(image, (640, 360))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, minNeighbors=5) # 耗费时间的操作 每一张土拍你都要遍历
for x, y, w, h in faces:
# cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
face = image[y:y + h, x:x + w] # face = 人脸图片在整个视频中的范围
face = face[::10, ::10] # 将人脸图片 每隔10个像素取出来一次
face = np.repeat(np.repeat(face, 10, axis=0), 10, axis=1) # 将像素放10次 在两个方向上
image[y:y + h, x:x + w] = face[:h, :w] # 将整个视频中的人脸位置赋值为替换成马赛克的人脸
cv2.imshow("img", image)
key = cv2.waitKey(1)
if key == ord('q'):
print("exit")
break
cv2.destroyAllWindows()
video.release()
其实对摄像头的处理 也就是对视频进行逐帧的处理
这里用到一个调取摄像头的函数
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
0是物理机摄像头,1是网络摄像由或者外接摄像头
注意,一定要先对图片进行灰度处理
代码:
import cv2
import numpy as np
# 摄像头人脸识别
if __name__ == '__main__':
# cap = cv2.VideoCapture(0)
# img = cv2.imread("./img/wang.jpg")
while True:
flag, frame = cap.read()
face_detector = cv2.CascadeClassifier('./xml/haarcascade_frontalface_alt.xml')
if not flag:
break
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
# img2 = cv2.resize(img,(w,h))
# frame[y:y+h,x:x+w] = img2
cv2.imshow("frame", frame)
key = cv2.waitKey(1000 // 34)
if key == ord('q'):
break
cv2.destroyAllWindows()
cap.release()