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实现提取百度搜索结果的方法
May 19 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
python读取二进制mnist实例详解
May 31 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
Django组件之cookie与session的使用方法
Jan 10 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
You might like
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP Mysql编程之高级技巧
2008/08/27 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP文件操作详解
2016/12/30 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
python网络编程示例(客户端与服务端)
2014/04/24 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
个人四风对照检查材料
2014/09/26 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript