当我们在观看视频的时候,尤其是国内的综艺出现的某个不该出现的人脸,就出现了一些奇怪的马赛克,影响我们的观影体验,那么这些马赛克是如何精确的加上去的呢?有什么方法批量实现呢?
本次我们就来用Python实现对视频自动打码!

准备工作

环境使用 Python3.8 和 pycharm2021

实现原理

  1. 将视频分为音频和画面;
  2. 画面中出现人脸和目标比对,相应人脸进行打码;
  3. 处理后的视频添加声音;

模块

手动安装一下 cv2 模块 ,pip install opencv-python 安装
安装遇到报错,不会安装看我主页置顶文章有。

素材工具

我们需要安装一下 ffmpeg 音视频转码工具

代码解析

导入需要使用的模块

import cv2
import face_recognition  # 人脸识别库  99.7%    cmake  dlib  face_recognition
import subprocess

将视频转为音频

def video2mp3(file_name):""":param file_name: 视频文件路径:return:"""outfile_name = file_name.split('.')[0] + '.mp3'cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_nameprint(cmd)subprocess.call(cmd, shell=False)

打码

def mask_video(input_video, output_video, mask_path='mask.jpg'):""":param input_video: 需打码的视频:param output_video: 打码后的视频:param mask_path: 打码图片:return:"""# 读取图片mask = cv2.imread(mask_path)# 读取视频cap = cv2.VideoCapture(input_video)# 视频  fps  width  heightv_fps = cap.get(5)v_width = cap.get(3)v_height = cap.get(4)# 设置写入视频参数  格式MP4# 画面大小size = (int(v_width), int(v_height))fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')# 输出视频out = cv2.VideoWriter(output_video, fourcc, v_fps, size)# 已知人脸known_image = face_recognition.load_image_file('tmr.jpg')biden_encoding = face_recognition.face_encodings(known_image)[0]cap = cv2.VideoCapture(input_video)while (cap.isOpened()):ret, frame = cap.read()if ret:# 检测人脸# 人脸区域face_locations = face_recognition.face_locations(frame)for (top_right_y, top_right_x, left_bottom_y, left_bottom_x) in face_locations:print((top_right_y, top_right_x, left_bottom_y, left_bottom_x))unknown_image = frame[top_right_y - 50:left_bottom_y + 50, left_bottom_x - 50:top_right_x + 50]if face_recognition.face_encodings(unknown_image) != []:unknown_encoding = face_recognition.face_encodings(unknown_image)[0]# 对比人脸results = face_recognition.compare_faces([biden_encoding], unknown_encoding)# [True]# 贴图if results == [True]:mask = cv2.resize(mask, (top_right_x - left_bottom_x, left_bottom_y - top_right_y))frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = maskout.write(frame)else:break

音频添加到画面

def video_add_mp3(file_name, mp3_file):""":param file_name: 视频画面文件:param mp3_file:  视频音频文件:return:"""outfile_name = file_name.split('.')[0] + '-f.mp4'subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=False)

完整代码

import cv2
import face_recognition  # 人脸识别库  99.7%    cmake  dlib  face_recognition
import subprocessdef video2mp3(file_name):outfile_name = file_name.split('.')[0] + '.mp3'cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_nameprint(cmd)subprocess.call(cmd, shell=False)def mask_video(input_video, output_video, mask_path='mask.jpg'):# 读取图片mask = cv2.imread(mask_path)# 读取视频cap = cv2.VideoCapture(input_video)# 视频  fps  width  heightv_fps = cap.get(5)v_width = cap.get(3)v_height = cap.get(4)# 设置写入视频参数  格式MP4# 画面大小size = (int(v_width), int(v_height))fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')# 输出视频out = cv2.VideoWriter(output_video, fourcc, v_fps, size)# 已知人脸known_image = face_recognition.load_image_file('tmr.jpg')biden_encoding = face_recognition.face_encodings(known_image)[0]cap = cv2.VideoCapture(input_video)while (cap.isOpened()):ret, frame = cap.read()if ret:# 检测人脸# 人脸区域face_locations = face_recognition.face_locations(frame)for (top_right_y, top_right_x, left_bottom_y, left_bottom_x) in face_locations:print((top_right_y, top_right_x, left_bottom_y, left_bottom_x))unknown_image = frame[top_right_y - 50:left_bottom_y + 50, left_bottom_x - 50:top_right_x + 50]if face_recognition.face_encodings(unknown_image) != []:unknown_encoding = face_recognition.face_encodings(unknown_image)[0]# 对比人脸results = face_recognition.compare_faces([biden_encoding], unknown_encoding)# [True]# 贴图if results == [True]:mask = cv2.resize(mask, (top_right_x - left_bottom_x, left_bottom_y - top_right_y))frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = maskout.write(frame)else:breakdef video_add_mp3(file_name, mp3_file):outfile_name = file_name.split('.')[0] + '-f.mp4'subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=False)if __name__ == '__main__':# 1.video2mp3('cut.mp4')# 2.mask_video(input_video='cut.mp4',output_video='output.mp4')# 3.video_add_mp3(file_name='output.mp4',mp3_file='cut.mp3')

在这里还是要推荐下我自己建的Python学习Q群:1020465983,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),
包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

视频怎么批量打码?Python实现视频自动打码分享相关推荐

  1. python语言编程基础视频_网络编程-5_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...

    通过学习,对Python有一定的了解,学习Python语法,可以使用Python原生语言开发项目.对于Python的应用于开发有一个系统的认知,对于未来的发展方向有清晰的认识.主要知识点包括基本语法. ...

  2. 竖版视频怎么批量转换成横版视频

    如果我们在发布视频素材的过程中遇到发布不成功的情况,要怎么解决呢?大家可以看看是不是因为不支持横版视频播放的原因呢?今天小编就来分享一下怎么快速将横版视频快速转换成竖版视频,感兴趣的小伙伴快跟着来看看 ...

  3. python为视频加logo_如何用python 在视频上添加自己的logo

    先准备好自己的logo 最好是透明图片,这样添加上去后才不显得突兀.比如下面例子中的logo_sc.png就是一个透明图片. 参照如下代码处理 #!/usr/bin/python3 # -*- cod ...

  4. 财码python官网_财码Python小实验之融资分析

    从本篇开始,财码小秘书将带小伙伴们进入投融资专题,今天的主题是融资分析小实验,欢迎大家来撩 . 01 融 资 概 述融资是指企业为满足生产经营资金的需要,向企业外部单位或个人以及从其企业内部筹措资金的 ...

  5. python提取视频字幕_荐利用Python提取视频中的字幕(文字识别)

    学了好久机器学习的内容有些许枯燥,今天我们来做一个Python的小项目来玩耍吧! 项目背景 通过获取百度API实现视频文字识别. 需求阐述 将.MP4格式视频裁剪成一帧一帧的图片再将图片中的字幕摘取出 ...

  6. 图片合成视频,视频文件过大了,python 改变视频的码率, 压缩视频文件

    from moviepy.editor import VideoFileClipa = VideoFileClip(r'E:\video\2023-01-30_13-38-58_res.mp4') # ...

  7. python把视频取帧_用Python提取视频帧

    我想提取视频帧并保存为图像.import os, sys from PIL import Image a, b, c = os.popen3("ffmpeg -i test.avi" ...

  8. python语言表白源码-python七夕浪漫表白源码

    本文实例为大家分享了python七夕浪漫表白的具体代码,供大家参考,具体内容如下 from turtle import * from time import sleep def go_to(x, y) ...

  9. [附源码]Python计算机毕业设计SSM旅游足迹分享系统(程序+LW)

    环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,St ...

  10. python视频教学视频哪个好-Python入门视频看哪个好?适合初学者的教学视频推荐...

    Python作为一门新手友好的编程语言,对于初学者来说,还是有一定的学习难度的.目前的Python学习资料在网上可以找到很多,那么Python入门视频看哪个好呢?本文就为大家推荐小编的免费Python ...

最新文章

  1. [文章集合] 在Windows Server 2012上关于Vmware的几点
  2. 12、动态视图组件ListView、GridView
  3. mini2440系统引导(四)存储控制器
  4. (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置
  5. NHibernate应用二:第一个NHibernate程序
  6. wmi接口如何通过Win32_Volume类修改盘符
  7. 卧槽,柠檬也能做汽车???
  8. jqGrid 中的editrules来自定义colModel验证规则
  9. Chromedriver的安装
  10. (93)异步FIFO结构,为什么用格雷码? ,面试必问(十七)(第19天)
  11. Spark 1.0.1源码安装
  12. [HAOI2005] 希望小学
  13. awakeFromNib 与 viewDIdLoad 自己小结
  14. 25.卷1(套接字联网API)--- 信号驱动式IO
  15. java从0单排之java就业培训教程复习与面试题回顾——02
  16. 文本文档怎么改格式html,文本文档怎么显示txt-文本文档怎么改格式
  17. 佳博GP-L80180 打印机 win7下 驱动方式 打印
  18. 不同证券的资产收益率统计(2012-2020年)
  19. Recovered from a route's Handler('github.com/kataras/iris/mvc.(*ControllerActivator).handlerOf.func2
  20. ODC20:更开放的行业解决方案,进击的OPPO IoT生态与云能力

热门文章

  1. Visual.Assist.X.10.9.Build.2375.0 2020.05.16 最新版
  2. 管理台权限模块 - 完整路由权限及按钮权限
  3. 搭建在线版ps网站源码_无需数据库
  4. cpu功耗排行_2019年cpu功耗排行榜_电脑处理器排行榜2019
  5. 史上最雷人的神曲--last night i stuck in the wrong hole
  6. android webview播放mp4,Android的webview不播放mp4视频在同一页
  7. 美团后台开发两轮面经(已入职)
  8. 猿创征文 | 国产数据库之DM数据库详解安装和使用
  9. Windows下MySQL的错误日志
  10. 异装癖者 transvestite