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-基础-入门 简介
Aug 09 Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 Python
python根据出生日期返回年龄的方法
Mar 26 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
Django处理文件上传File Uploads的实例
May 28 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
python issubclass 和 isinstance函数
Jul 25 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
python 绘制正态曲线的示例
Sep 24 Python
Python实现Hash算法
Mar 18 Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
You might like
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
jQuery事件用法详解
2016/10/06 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
python使用pil生成图片验证码的方法
2015/05/08 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Java和Javasciprt的区别
2012/09/02 面试题
介绍一下MD5加密算法
2016/11/12 面试题
最新的大学生找工作自我评价
2013/09/29 职场文书
应届生骨科医生求职信
2013/10/31 职场文书
公司司机岗位职责
2014/02/07 职场文书
小学开学典礼主持词
2014/03/19 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
教师个人考察材料
2014/12/16 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
体育个人工作总结
2015/02/09 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
node快速搭建后台的实现步骤
2022/02/18 NodeJs
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android