作者:守卫
关键词:视频\人脸\打马赛克
在跨境电商平台上传店铺商品视频以及图片时,会涉及到需要将上传的图片或视频中出现的人脸部分进行打码处理,而一般人脸识别一般都要借助智能云接口,或者通过手动的方法进行打码。
这里介绍的一种方案,是利用本地资源库 opencv_python 库中 cv2模块 进行离线本地只能识别人脸,并进行打码处理,下面是详细解决方案。
这里将打开的视频进行分帧处理之后,要将每帧的都进行 灰度处理,避免颜色差异带来的误差

注:
(1)人脸检测的文件 "haarcascade_frontalface_default.xml" 在导入库中自带的,!!!无需单独下载,直接写入就可以了!!!
(2) 导出的视频名称,一定要以 !!!.avi !!! 进行结尾
import cv2
cap = cv2.VideoCapture("添加的视频名") #添加视频
face_rule = cv2.CascadeClassifier(cv2.data.haarcascades +"haarcascade_frontalface_default.xml")
eye_rule = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 指定视频视频编解码器格式
fps = cap.get(cv2.CAP_PROP_FPS) #帧率
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #自动获取视频大小
out = cv2.VideoWriter('导出的视频名', fourcc, fps, size) #opencv好像只能导出avi格式
offset = 8
while True:
ret,frame=cap.read()
if ret:
#灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#人脸、眼睛位置 获取
faces = face_rule.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5)
eyes = eye_rule.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5)
if len(eyes) != 0 and len(faces) == 0:
faces = faces_temp
#马赛克处理
for (x,y,w,h) in faces:
for row in range(x,x+w,offset):
for col in range(y,y+h,offset):
color = frame[col,row]
frame[col:col+8,row:row+8] = color
if len(faces) != 0:
faces_temp = faces
out.write(frame)
else:
break
打码的涉及原理为,将每帧的相邻9*9的像素点设置成相同的颜色,进而实现的打码处理
可以根据设置好的变量 offset 进行调节马赛克大小
import cv2
import numpy
cap = cv2.VideoCapture("添加的视频名") #添加视频
#导入图片
img = cv2.imread("添加图片名称")
face_rule = cv2.CascadeClassifier(cv2.data.haarcascades +"haarcascade_frontalface_default.xml")
eye_rule = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 指定视频视频编解码器格式
fps = cap.get(cv2.CAP_PROP_FPS) #帧率
print(fps)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #自动获取视频大小
out = cv2.VideoWriter('output.avi', fourcc, fps, size) #opencv好像只能导出avi格式
offset = 8
while True:
ret,frame=cap.read()
if ret:
#灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#人脸、眼睛位置 获取
faces = face_rule.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5)
eyes = eye_rule.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5)
if len(eyes) != 0 and len(faces) == 0:
faces = faces_temp
#表情包处理
for (x,y,w,h) in faces:
resized = cv2.resize(img,(w,h))
frame[y:y+h , x:x+w] = resized
if len(faces) != 0:
faces_temp = faces
out.write(frame)
cv2.imshow("ceshi",frame)
cv2.waitKey(1)
else:
break
