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新手在作用域方面经常容易碰到的问题
Apr 03 Python
python通过socket查询whois的方法
Jul 18 Python
Python读取properties配置文件操作示例
Mar 29 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
Python换行与不换行的输出实例
Feb 19 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
Python如何批量生成和调用变量
Nov 21 Python
python解包概念及实例
Feb 17 Python
python分分钟绘制精美地图海报
Feb 15 Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
You might like
德生9700DX电路分析
2021/03/02 无线电
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
php多文件上传下载示例分享
2014/02/20 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
RequireJs的使用详解
2017/02/19 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
对python的输出和输出格式详解
2018/12/08 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
校长岗位职责
2013/11/26 职场文书
护理专业自我鉴定
2014/01/30 职场文书
社区党员公开承诺书
2014/08/30 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
肖申克救赎观后感
2015/06/02 职场文书