NO.44-视频人脸自动打🐎,无需借助任何接口——By.杭州组
评论
收藏

NO.44-视频人脸自动打🐎,无需借助任何接口——By.杭州组

经验分享
守卫
2024-01-09 14:01·浏览量:540
守卫
发布于 2024-01-03 10:15更新于 2024-01-09 14:01540浏览

作者:守卫

关键词:视频\人脸\打马赛克

一、问题背景:

在跨境电商平台上传店铺商品视频以及图片时,会涉及到需要将上传的图片或视频中出现的人脸部分进行打码处理,而一般人脸识别一般都要借助智能云接口,或者通过手动的方法进行打码。

这里介绍的一种方案,是利用本地资源库 opencv_python 库中 cv2模块 进行离线本地只能识别人脸,并进行打码处理,下面是详细解决方案。

二、解决方法:

这里将打开的视频进行分帧处理之后,要将每帧的都进行 灰度处理,避免颜色差异带来的误差

1.逻辑代码语句

注:

(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


2.马赛克处理介绍

 打码的涉及原理为,将每帧的相邻9*9的像素点设置成相同的颜色,进而实现的打码处理

 可以根据设置好的变量 offset 进行调节马赛克大小

3.非马赛克处理-替换表情包

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

三、展示结果


收藏8
全部评论1
最新
发布评论
评论