基于OpenCv-Python的视频组合

step0:概述

  • 动机:手头有数个20秒左右的短视频(守望先锋最佳镜头),期望能组合成一个长视频

英雄不朽,图片来源http://upload-images.jianshu.io/upload_images/7241055-b71baeb2d99c0e77.jpg

  • 技术路线:opencv+python(opencv在Python中的封装库是cv2,依赖于numpy)

step1:打开并显示视频

要组合视频,首先需要打开视频并获取每一帧的图像,在opencv中可以使用VideoCapture这个类来打开视频,打开的视频也存在于这个类中,使用.read()方法也可以获得每一帧的图像,该方法的用法类似于生成器,每调用一次都会返回下一帧的图像。其中.waitKey()方法是延迟并获取键盘输入,传入参数是延迟时间数,单位是1/60s且必须是整数,因为原视频是60帧,所以间隔为1时是常速播放

import cv2

capture = cv2.VideoCapture(
    "../leviathan's highlight_17-08-16_00-52-33.mp4")
if capture.isOpened():
    while True:
        ret, prev = capture.read()
        if ret is True:
            cv2.imshow("", prev)
        else:
            break
        cv2.waitKey(1)

玩过守望先锋的小伙伴应该知道,那个最佳镜头的最后会一段浮现守望先锋logo的部分,我们需要切掉这一部分,方法是只截取前17.5秒的视频,因为不知道是否有24帧的视频,所以要先获得帧率再截取前17.5*fps的视频,现在的代码是

import cv2

capture = cv2.VideoCapture(
    "../leviathan's highlight_17-08-16_00-52-33.mp4")
print(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
print(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = capture.get(cv2.CAP_PROP_FPS)
if capture.isOpened():
    i = 0
    while i < fps * 17.5:
        i += 1
        ret, prev = capture.read()
        if ret is True:
            cv2.imshow("", prev)
        else:
            break
        cv2.waitKey(1)

顺便还看了下幕布的尺寸为1920*1080 参考python tools:计算视频的 FPS,以及总帧数

step2打开并显示一堆视频

因为视频一共有20个左右,所以可以使用os模块中的listdir()获取所有文件,并筛选带.mp4后缀的视频文件。这样获取的list是完全按顺序排列的,我们还可以使用random.shuffle()方法打乱整个视频列表

mp4list = [x for x in os.listdir("../") if x[-4:] == ".mp4"]
random.shuffle(mp4list)

于是遍历整个列表看所有视频了

import cv2
import os
import random

mp4list = [x for x in os.listdir("../") if x[-4:] == ".mp4"]
random.shuffle(mp4list)
print(mp4list)
for mp4file in mp4list:
    capture = cv2.VideoCapture("../%s" % mp4file)
    fps = capture.get(cv2.CAP_PROP_FPS)
    print(fps)
    if fps != 60:
        jump = 20
    else:
        jump = 1
    if capture.isOpened():
        i = 0
        while i < fps * 1:
            i += 1
            ret, prev = capture.read()
            if ret is True:
                cv2.imshow("", prev)
            else:
                break
            cv2.waitKey(jump)
cv2.destroyAllWindows()

step3:保存为一个大视频

保存视频首先需要创建一个视频容器,可以使用cv2.VideoWriter,输入参数为路径,压缩方式,帧率,幕布大小,随后使用该对象的write()方法即可写入一帧,写入完成后,使用release()方法释放容器并保存,若在次之前程序中断,那视频文件会是损坏状态,于是程序是这样的

import cv2
import os
import random

VideoWriter = cv2.VideoWriter(
    "./overwatch.avi",
    cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), 60,
    (1920, 1080))

mp4list = [x for x in os.listdir("../") if x[-4:] == ".mp4"]
random.shuffle(mp4list)
print(mp4list)
for mp4file in mp4list:
    print(mp4file)
    capture = cv2.VideoCapture("../%s" % mp4file)
    fps = capture.get(cv2.CAP_PROP_FPS)
    if capture.isOpened():
        i = 0
        while i < fps * 17.5:
            i += 1
            ret, prev = capture.read()
            if ret is True:
                if fps == 60:
                    VideoWriter.write(prev)
                else:
                    VideoWriter.write(prev)
                    VideoWriter.write(prev)
            else:
                break
VideoWriter.release()
cv2.destroyAllWindows()

其中为了补偿30帧左右的视频,非60帧图片一帧写入两次

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

《小美好》短评文本情感分析+生成词云

因为最近看了一下《致我们单纯的小美好》,虽然情节是有点“二”吧,但是看了觉得真的很怀念初高中的日子,一时玩心大发,于是就想搞点有意思的东西。。。首先去爬了豆瓣...

4249
来自专栏窗户

scratch写的图灵机

1483
来自专栏编程微刊

【前端图表】echarts散点图鼠标划过散点显示信息

2013
来自专栏PPV课数据科学社区

【工具】用R软件绘制中国分省市地图

【注】新版本的maptools包对很多函数进行了修改,对于修改的内容,文章中用红色的文字进行了说明。 鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑...

4949
来自专栏ThoughtWorks

TW洞见〡3D打印的各种问题及解决方案

文章作者来自ThoughtWorks:贺思聪 ,图片来自网络。 3D打印机已经买回来几个月了,基本上每天都要打印一些东西,期间遇到了很多的问题积累了很多的经验...

40012
来自专栏机器之心

资源 | Facebook开源DrQA的PyTorch实现:基于维基百科的问答系统

选自GitHub 机器之心编译 参与:Panda 今年 4 月,斯坦福大学和 Facebook 人工智能研究所在 arXiv 发布了一个基于维基百科的开放域问题...

4565
来自专栏崔庆才的专栏

跟繁琐的模型说拜拜!深度学习脚手架 ModelZoo 来袭!

好多天没有更新原创文章了,国庆前的一段时间确实比较忙,整个九月在参加各种面试,另外还有公司的项目,还有自己的毕设,另外还需要准备参加一些活动和讲座,时间排的很紧...

2702
来自专栏算法+

双边滤波算法的简易实现bilateralFilter

没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下。 最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去。 没耐性写下去了,...

5786
来自专栏Crossin的编程教室

【每周一坑】蜥蜴流感与贝叶斯定理

春季是流感的高发季节。不要觉得只是小小的“感冒”,严重起来甚至也会危及生命,而且还没有特效药。因此,身体不适请及时到医院检查。

1613
来自专栏专知

【干货】TensorFlow协同过滤推荐实战

【导读】本文利用TensorFlow构建了一个用于产品推荐的WALS协同过滤模型。作者从抓取数据开始对模型进行了详细的解读,并且分析了几种推荐中可能隐藏的情况及...

82511

扫码关注云+社区

领取腾讯云代金券