OpenCV图像运算+Moviepy实现视频旋转叠加

Python+OpenCV视频的读取与处理;截取部分图像数据; 边界填充 视频读取 ●cv2.VideoCapture可以捕获摄像头, 用数字来控制不同的设备,例如0,1。 ●如果是视频文件,直接指定好路径即可。 import cv2 #opencv默认读取格式是BGR vc = cv2.VideoCapture('test.mp4') #检查是否能够打开 if vc.isOpened(): open, frame = vc.read() else: open = False while open: ret, frame = vc.read() 阅读详情
☞ ░ 前往老猿Python博客 https://blog.youkuaiyun.com/LaoYuanPython ░

一、引言

在《OpenCV-Python常用图像运算:加减乘除幂开方对数及位运算》介绍了OpenCV主要的图像运算,视频是由一帧帧图像构成,通过OpenCV和Moviepy的灵活运用,可以实现一些特殊的特效。本文将介绍通过OpenCV图像运算+Moviepy实现视频叠加透明效果。

二、程序实现

本案例实现一个可以在视频上面叠加一个旋转视频或旋转图片的通用方法,支持两个内容大小不同的视频叠加。为了支持叠加对象为图片,需要将图片转换成视频,为了尽可能突出图片的表达内容,在将图片转视频前将图片的背景色转换为黑色。
相关程序包括如下函数:

  1. adjustImgAccordingToRefImg:参考底层视频大小调整上层视频大小,被帧生成函数get_frame调用
  2. get_frame:根据两个需要叠加的视频的帧生成结果视频的帧,生成时调用adjustImgAccordingToRefImg调整上层视频大小
  3. ridPicBackground:去掉图片背景色,被convertPicToVideo调用
  4. convertPicToVideo:将图片转成视频,被videoOverlyObjMask调用
  5. videoOverlyObjMask:将视频和叠加对象对应视频叠加,叠加时通过adjustImgAccordingToRefImg参考底层视频帧大小调整上层视频帧大小

上述函数中关键函数为get_frame、videoOverlyObjMask,这二个函数是视频旋转并叠加的主程序代码。相关程序代码如下:



def get_frame(level0Clip,level1Clip,t):
    """
    功能:根据两个大小不同的剪辑生成结果剪辑的帧
    :param level0Clip: 底层的剪辑,一般要求该剪辑的宽和高度不小于上层剪辑的宽和高,如果超过就只剪裁掉超出范围的边缘部分
    :param level1Clip: 上层剪辑,要求该剪辑为黑色的部分不能覆盖底层剪辑的图像
    :param t: 帧对应时刻
    :return: 新剪辑对应t时刻的合成帧,其图像为上层剪辑非透明部分叠加底层剪辑未被上层非透明部分覆盖部分
    """

    img1 = level0Clip.get_frame(t)
    img2 = level1Clip.get_frame(t)
    if img1.size!=img2.size:#如果两个剪辑大小不同
        img2 = adjustImgAccordingToRefImg(img2, img1) #根据底层剪辑的帧大小调整上层剪辑的大小,确保最终两个剪辑大小一致

    #取上层剪辑的非透明部分和底层剪辑未被覆盖部分
    imgGray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #将上层剪辑帧图像转成灰度图
    retval, imgMask = cv2.threshold(imgGray, 1, 255, type=cv2.THRESH_BINARY) #将灰度图二值化作为掩膜
    maskInv = cv2.bitwise_not(imgMask) #上层剪辑掩膜求反,用于获取底层剪辑需要显示内容
    result = cv2.bitwise_and(img2, img2, mask=imgMask) + cv2.bitwise_and(img1, img1, mask=maskInv)
    return result


def videoOverlyRotateObj(videoFName,objType='self',obj=None):
    """
    剪辑自身叠加一个该剪辑旋转的层,旋转层黑色的部分不能遮挡下层的剪辑内容
    :param videoFName: 剪辑来源视频文件
    :param objType、obj:
        self:剪辑自身叠加自身旋转内容,obj值忽略
        img:图片文件或图片矩阵对象,obj值为图片文件名会图片对象
        video:视频文件或剪辑,obj为视频文件名或剪辑对象
    :return: 参数视频剪辑自叠加一个旋转层对象,旋转层由参数objType、obj决定,对象大小最好小于videoFName对应视频大小,否则会被裁减
    """
    clip = VideoFileClip(videoFName, audio=True)
    if objType=='self':
        objClip = clip
    elif objType=='img':
        objClip = convertPicToVideo(obj, duration=clip.duration, createMask=False).set_fps(clip.fps)
    elif  objType=='video':
        if isinstance(obj,str): objClip = VideoFileClip(obj, audio=False)
        else: objClip = obj

    maskclip = objClip.rotate(angleF,expand=True).fx(vfx.resize,clip.size)

    make_frame = lambda t:get_frame(clip,maskclip,t)
    newclip = VideoClip( make_frame=make_frame,  duration=clip.duration).set_fps(clip.fps)

    return newclip

if __name__=='__main__':
    result1 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
    result1.write_videofile(r"F:\video\WinBasedWorkHard_new.mp4", threads=8)
    result2 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4")
    result2.write_videofile(r"F:\video\WinBasedWorkHard_mask_self.mp4", threads=8)
    result3 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
    result3.write_videofile(r"F:\video\WinBasedWorkHard_mask_pic.mp4", threads=8)
    result4 = videoOverlyRotateObj(r"F:\video\mydream.mp4", 'video',r"F:\video\WinBasedWorkHard_src.mp4")
    result4.write_videofile(r"F:\video\WinBasedWorkHard_mask_video.mp4", threads=8)

为了与付费专栏的文章有所差别,其他次要函数在此就不提供代码了。本文对应的付费专栏文章为《使用OpenCV图像运算+Moviepy实现视频叠加案例》。

三、案例效果

3.1、相关素材介绍
  • WinBasedWorkHard_src.mp4:周星驰的“爱拼才会赢”MV抖音视频
  • mydream.mp4:张靓颖的“我的梦”抖音视频
  • Lotus.jpg:荷花图片
    在这里插入图片描述
3.2、剪辑和自身旋转剪辑叠加效果

在这里插入图片描述

3.3、视频和图片构造的旋转剪辑叠加

在这里插入图片描述

3.4、剪辑和另一个旋转剪辑叠加效果

在这里插入图片描述

四、小结

本文详细了使用OpenCV图像运算+Moviepy实现视频叠加后,最终结果剪辑中的上层剪辑和下层剪辑叠加后,上层剪辑背景色部分被下层剪辑内容所呈现替代的方案。通过该实现案例的介绍,可以理解OpenCV图像运算在图像处理中的作用,并在多个剪辑制作特效中使用该方法制作视频特效。

如果觉得本文可以给您带来帮助,请大家帮忙点个赞、加个收藏,谢谢!

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.youkuaiyun.com/laoyuanpython/category_9979286.html

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。这2个专栏内容的导读请参考《Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》。

本文对应的付费专栏文章为《使用OpenCV图像运算+Moviepy实现视频叠加案例》。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.youkuaiyun.com/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.youkuaiyun.com/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.youkuaiyun.com/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.youkuaiyun.com/LaoYuanPython/article/details/107580932)。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.youkuaiyun.com/laoyuanpython/category_9831699.html)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.youkuaiyun.com/LaoYuanPython ░
Python视频自动化处理:基于FFmpeg与OpenCV的编程式剪辑框架实践 视频处理自动化是现代内容生产与数据预处理中的关键技术,其核心原理在于将视频编辑操作抽象为可编程模块。通过集成FFmpeg和OpenCV等底层多媒体库,开发者能够实现批量转码、智能剪辑与动态合成等功能。这种技术方案的价值在于显著提升处理效率,降低人工成本,并支持复杂条件逻辑。在应用场景上,它广泛适用于UGC平台的内容标准化、在线教育视频批量生产以及数据可视化报告生成等场景。本文以fabric-video-editor项目为例,深入探讨如何利用Python构建可编程的视频处理流水线,实现从基础剪辑到高级合成的全 阅读详情

相关推荐

眩晕效果生成器:从图像处理到WebGL的趣味视觉实现

图像处理与计算机图形学是数字内容创作的核心技术,其原理在于通过算法对像素或几何数据进行变换,从而生成特定的视觉效果。在工程实践中,这类技术常被用于开发轻量级的创意工具,例如实现漩涡扭曲、径向波动等视觉特效。本文聚焦于一个趣味性视觉项目,通过结合前端WebGL(如Three.js)与后端Python图像处理库(如PIL/OpenCV),详细拆解了如何构建一个能够生成“眩晕感”视觉内容的生成器。该项目不仅涉及Canvas 2D动画和三维几何体扭曲,还涵盖了从本地脚本到API服务的完整部署流程,为技术爱好者提供了

weixin_30700099的博客 400

基于PythonOpenCv的视频图像处理

视频一般有两种来源,一种是从本地磁盘加载,另一种是从摄像头等设备实时获取。上述两种视频获取方式分别对应着OpenCV2的两个函数CaptureFromFile()和CaptureFromCAM().在OpenCV3中则统一为一个用于处理视频源载入的函数VideoCapture()。

qq_59931372的博客 5494

视频创作思维对比:Timeline可视化与Code编程自动化

在数字媒体制作领域,视频创作通常涉及两种核心范式:基于时间线的可视化编辑与基于代码的编程化生成。Timeline思维以Adobe After Effects、Premiere等非线性编辑软件为代表,通过图形化界面实现所见即所得的层级化创作,适合需要直观视觉反馈和艺术化处理的场景。Code思维则依托Python的MoviePy、FFmpeg等工具,通过脚本和参数化逻辑实现视频的批量生成与自动化处理,其核心优势在于可重复性和规模化效率。这两种模式分别对应创意表达与工程实践的不同需求,在实际工作流中常形成互补。例

weixin_30561177的博客 325

实现两视频叠加时上层剪辑透明部分不遮挡下层内容的两种方案

本文介绍了实现两视频叠加时上层剪辑透明部分不遮挡下层内容的遮罩模式和OpenCV图像运算模式两种方案,在相关链接中提供了完整的代码,并对比了两种实现方式的差异。阅读本文有助于大家理解视频mask遮罩、OpenCV图像处理运算以及音视频剪辑合成的方法。

老猿Python 6294

moviepy音视频剪辑:使用mask遮罩实现视频叠加透明效果

☞ ░ 前往老猿Python博客 https://blog.youkuaiyun.com/LaoYuanPython ░ 一、引言 在《moviepy音视频剪辑:mask clip遮罩剪辑、遮片、蒙版的作用以及其包含的构成内容》中介绍:“mask遮罩是一种只有灰度值的像素构成的帧组成的剪辑,其作用就是在带mask的剪辑与其他剪辑合成时确认是否显示带mask剪辑的对应像素。” 本文实现一个使用mask遮罩剪辑实现叠加视频的透明效果。 二、程序实现 本案例实现一个可以在视频上面叠加一个旋转视频或旋转图片的通用方法,支持两

老猿Python 7149

使用OpenCV和Moviepy实现Python中的图像运算和视频旋转叠加

通过以上代码和说明,我们可以实现使用OpenCV和Moviepy库进行图像运算和视频旋转叠加的操作。在本文中,我们将介绍如何使用OpenCV和Moviepy库来进行图像运算和视频旋转叠加的操作。我们将使用Python编程语言,并提供相应的源代码示例。接下来,我们将使用Moviepy库来处理视频文件。我们将定义一个函数来实现视频旋转和叠加的操作。接下来,我们将定义一个函数来实现图像旋转和叠加的操作。现在,我们可以调用上面定义的函数来处理图像和视频文件了。函数将旋转后的图像和叠加图像进行叠加,并使用。

Byte_O_O的博客 267

OpenCV-Python图形图像处理专栏文章目录

OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析 OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理 OpenCV-Python图像位与运算bitwise_and函数详解 OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比 OpenCV-Python图像的加法运算cv2.add函数详解 OpenCV-Python图像融合cv2.addWeighted权重加法函数详解 Op

老猿Python 6717

用Python和OpenCV库实现识别人物出现并锁定

我们将分为以下几个步骤完成这个项目:安装必要的库 ,加载和显示视频,应用预训练的人物检测模型 ,在检测到的人物周围绘制边界框,保存和显示结果.

a871923942的博客 1120

Moviepy的fl_image函数到底怎么用?一个视频雪花案例带你吃透帧级处理

本文详细解析了Moviepy的fl_image函数在视频帧级处理中的应用,通过一个雪花特效案例展示如何实现专业级视频处理。文章涵盖帧处理机制、雪花粒子系统设计、OpenCV集成优化等关键技术,帮助开发者掌握高效视频特效制作方法。

weixin_30832405的博客 429

使用OpenCV图像运算+Moviepy实现视频叠加案例

本文详细了使用OpenCV图像运算+Moviepy实现视频叠加后,最终结果剪辑中的上层剪辑和下层剪辑叠加后,上层剪辑背景色部分被下层剪辑内容所呈现替代的方案。通过该实现案例的介绍,可以理解OpenCV图像运算在图像处理中的作用,并在多个剪辑制作特效中使用该方法制作视频特效。

老猿Python 3412

Python实现图像运算与视频处理——旋转和叠加

具体来说,我们将介绍如何使用OpenCV对图像进行旋转、裁剪、阈值处理等操作,并在图像上叠加文字和形状等元素。同时,我们也会使用Moviepy库实现视频的旋转和叠加效果。在OpenCV中实现图像旋转可以使用cv2.warpAffine()函数,这个函数会通过指定旋转角度、旋转中心点和缩放比例等参数来生成变换矩阵从而对图像进行旋转。在OpenCV中,使用cv2.putText()和cv2.rectangle()等函数可以在图像上添加文字和矩形框等元素,我们可以通过这些函数来实现图像叠加的效果。

带你成为别人眼中的大佬! 499

别再只会用剪映了!用Python+OpenCV给视频加雪花特效,附完整代码和素材

本文详细介绍了如何使用Python和OpenCV创建电影级雪花特效视频,从核心技术解析到完整代码实现。通过OpenCV的图像处理技术和Moviepy的高效集成,开发者可以完全控制雪花的下落轨迹、大小和旋转角度,实现高度定制化的视频特效。文章还提供了性能优化和高级特效定制技巧,帮助读者提升视频处理效率和质量。

weixin_30411239的博客 372

[Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 前面一篇文章介绍了民族服饰及文化图腾识别,详细讲解图像点运算,包括灰度化处理、灰度线性变换、灰度非线性变换、阈值化处理。这篇文章将讲解两个重要的算法——傅里叶变换和霍夫变换,万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总

杨秀璋的专栏 1万+

别再只会用剪映了!用Python+OpenCV给视频加雪花特效,附完整代码和避坑指南

本文详细介绍了如何使用Python和OpenCV为视频添加电影级雪花特效,涵盖粒子系统原理、性能优化及工程化实现。通过OpenCV和Moviepy的底层处理,实现可定制的动态雪花效果,解决透明通道融合、粒子系统优化等核心问题,并提供完整代码和避坑指南。

weixin_30613343的博客 623

deep-bgremove:使用Deeplabv3和MoviePy生成蒙版的Pytorch工具,用于从图像中移除背景(但保留人物)。 绿屏无绿屏

深层BGR 这是我使用Pytorch的DeeplabV3分割模型进行背景去除的快速工具。 可以使用预先训练的砝码并从Pytorch Hub下载它,因此起步和运行应该非常容易。 MoviePy用于处理和I / O,它接受多种格式。 如果Cuda在系统上可用,则将使用它(您将要使用它,因为生成输出可能非常慢,尤其是对于大型视频而言)。 可以将遮罩电影放到After Effects之类的工具中,并用作Alpha通道。 安装 安装要求。 pip install -r requirements.txt 用法 python createmask.py --input " avideo.mp4 " --output " output.mp4 " (可选)使用--width调整输入的大小,并保持宽高比。 如果您有4k视频,则应将其调整为1080p大小以进行遮罩,否则将花费相当长的时间。 尖端 您将

大学物理第二章 质点动力学详解

大学物理第二章 质点动力学概念详解

weixin_63026364的博客 1万+

python带界面的人脸识别_基于Python的人脸识别实现带墨镜效果

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。DEAL WITH IT是这样一个效果,眼镜从屏幕外飞进来,带在用户的脸上。这种效果的最佳实例是以一种独特的方式完成的。今天,我们将编写一个生成器,该生成器使用任何有面部的静态图像作为输入。如果你想构建一个该效果的API,或者想以视频为输入来制作该效果,那么本文的代码是一个很好的开端。我从Erik Tahe...

weixin_39824801的博客 360

STM32H743 ADC多通道采样实战:CubeMX配置+DMA传输避坑指南

本文详细介绍了STM32H743 ADC多通道采样的实战配置,包括CubeMX参数设置、DMA传输优化及常见问题解决方案。重点解析了ADC模块的核心特性、多通道采样序列配置、Cache一致性处理等关键技术,帮助开发者高效实现稳定可靠的模拟信号采集系统。

weixin_29175469的博客 611

Python实战:打造个性化电子相册全流程指南

在实际操作中会发现,原始照片往往存在尺寸不一、方向错乱的问题。建议先建立标准化流程:用Pillow批量读取时检查EXIF信息自动旋转竖拍照片,然后统一缩放为16:9的画布比例,边缘填充黑色或模糊扩展背景。实际操作时,发现其内置环境已经预装好所有依赖库,省去了复杂的配置过程。生成的项目可以直接一键部署为在线可访问的相册页面,还能随时回编辑界面调整滤镜参数,比本地开发调试更方便。特别是音乐文件上传后自动分析时长的功能,解决了手动计算匹配的麻烦。更专业的做法是分析音乐节奏点,在转场时同步切换图片。

QuartzStag78的博客 354

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

嵌入式开发:用状态机实现STM32按键消抖,告别阻塞延时

在嵌入式系统开发中,处理异步事件和实时响应是核心挑战。状态机作为一种强大的编程模型,通过定义有限的状态、事件和状态转换规则,将复杂的、非线性的控制逻辑转化为清晰、确定且易于维护的代码结构。其技术价值在于实现逻辑的模块化、异步化和非阻塞化,能显著提升代码的可读性、可扩展性和系统实时性。这一思想广泛应用于协议解析、用户界面交互、传感器数据处理等场景。本文以嵌入式开发中基础的按键处理为例,针对传统“延时消抖”方法会阻塞主循环、影响实时性的痛点,深入讲解如何运用状态机思维重构按键消抖逻辑。通过分析状态机的核心三要素

weixin_33377602的博客 339

Python自动化生成手书风格视频:技术教程与项目展示的动态化解决方案

在技术内容创作领域,视频动态化是提升信息传达效率和视觉吸引力的关键手段。其核心原理在于将时间轴上的每一帧视为可编程状态,通过控制图像、文字等素材的属性(如位置、透明度、缩放)变化来生成连续动画。这项技术的核心价值在于将重复性、高成本的视频编辑工作转化为可脚本化、可复用的自动化流程,显著降低了动态内容创作的门槛。结合Python生态中的Pillow和MoviePy等库,开发者能够高效处理图像合成、时间线编排与视频渲染。典型的应用场景包括技术教程演示、项目成果展示、团队纪念视频以及社交媒体技术内容创作。本文聚焦

weixin_33720078的博客 348

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1491
上一篇: 实现两视频叠加时上层剪辑透明部分不遮挡下层内容的两种方案
下一篇: moviepy音视频剪辑:使用mask遮罩实现视频叠加透明效果
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值