Python实现视频自动打码的示例代码


Posted in Python onApril 08, 2022

序言

我们在观看视频的时候,有时候会出现一些奇怪的马赛克,影响我们的观影体验,那么这些马赛克是如何精确的加上去的呢?

本次我们就来用Python实现对视频自动打码!

准备工作

环境咱们还是使用 Python3.8 和 pycharm2021 即可

实现原理

将视频分为音频和画面;

画面中出现人脸和目标比对,相应人脸进行打码;

处理后的视频添加声音;

模块

手动安装一下 cv2 模块 ,pip install opencv-python 安装

素材工具

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

Python实现视频自动打码的示例代码

代码解析

导入需要使用的模块

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_name
    print(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  height
    v_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] = mask
            out.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 subprocess

def video2mp3(file_name):

    outfile_name = file_name.split('.')[0] + '.mp3'
    cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name
    print(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  height
    v_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] = mask
            out.write(frame)


        else:
            break


def 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实现视频自动打码的示例代码的文章就介绍到这了,更多相关Python视频打码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
采用python实现简单QQ单用户机器人的方法
Jul 03 Python
Python Tkinter简单布局实例教程
Sep 03 Python
Python脚本实时处理log文件的方法
Nov 21 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
Python绘图实现显示中文
Dec 04 Python
python 生成任意形状的凸包图代码
Apr 16 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
You might like
PHP中常用数组处理方法实例分析
2008/08/30 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python中xrange和range的区别
2014/05/13 Python
python错误处理详解
2014/09/28 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
linux 下selenium chrome使用详解
2020/04/02 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
文员个人的求职信范文
2013/09/26 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
班主任工作实习计划
2015/01/16 职场文书
英语通知范文
2015/04/22 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
关于MySQL中explain工具的使用
2023/05/08 MySQL