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 相关文章推荐
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Linux 修改Python命令的方法示例
Dec 03 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
用python写测试数据文件过程解析
Sep 25 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
Python插件机制实现详解
May 04 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
Python爬取数据并实现可视化代码解析
Aug 12 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 Python
python中if嵌套命令实例讲解
Feb 25 Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
Python&Matlab实现樱花的绘制
Python OpenCV形态学运算示例详解
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
You might like
PHP 全角转半角实现代码
2010/05/16 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
js树形控件脚本代码
2008/07/24 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
webpack之devtool详解
2018/02/10 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
利用Python实现图书超期提醒
2016/08/02 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
2015年计生工作总结范文
2015/04/24 职场文书