【Python脚本】视频稳像(Video Stabilization)

news2025/1/11 14:46:11

#【Python脚本】视频稳像(Video Stabilization)
参考:博客1
参考:
原文:https://blog.csdn.net/hjl240/article/details/52683738

开源:关键词 Video Stabilization

不错:

https://github.com/yaochih/awesome-video-stabilization

https://github.com/alex04072000/NeRViS

https://github.com/Annbless/DUTCode

https://github.com/mindazhao/PWStableNet

https://github.com/jinsc37/DIFRINT

python:

https://github.com/AdamSpannbauer/python_video_stab

https://github.com/sudheerachary/Mesh-Flow-Video-Stabilization

https://github.com/alex04072000/NeRViS

c的,依赖ffmpeg:

https://github.com/georgmartius/vid.stab

https://github.com/yossato/virtualGimbal

搜索:

https://github.com/yossato/virtualGimbal

视频稳像(Video Stabilization)

视频稳定(简称稳像),是指利用相关的算法,对视频设备采集的原始视频序列进行处理,去除其中的抖动。视频稳像的目的,一方面是为了让人眼观感舒适,有利于人工观测、判别等,另一方面也作为诸多其他后续处理的预处理阶段,如检测、跟踪和压缩。

稳像按作用机制分为光学、机械和电子稳像。

  1.  光学稳像通过主动光学部件自适应调整光路,补偿由于摄像平台抖动造成的图像运动,达到稳定图像的的目的;
    
  2.  机械稳像通过陀螺传感器等器件检测摄像平台的抖动,然后对伺服系统进行调整而达到稳定图像的目的;
    
  3.  电子(数字)稳像基于在连续视频图像之间进行运动估计,然后对视频中的每一帧图像进行运动滤波和运动补偿处理得到稳定的图像。
    

视频稳像原理概述

一般来讲,由于连续视频两帧图像之间相隔较短,所以相邻的两帧图像大部分内容是相同的,基于这种假设,两帧图像之间的相对运动可以分解为,大部分场景的全局运动和小部分场景的局部运动,而全局运动一般代表着摄像机的主观运动。图3-1示意了相邻两帧图像的全局运动与局部运动,四个小圆圈的平移代表了整幅图像的全局运动,而中间的小三角的运动则代表了局部运动。
在这里插入图片描述

由于摄像载体的不稳定,导致在连续的帧间全局运动出现了抖动,如图3-2所示。图中小圆圈在连续帧间上下起伏的运动轨迹就是由全局运动受到抖动干扰后形成的。视频稳像算法就是要保证得到正确的全局运动矢量,而消除掉抖动对于全局运动的影响。

在这里插入图片描述

运动模型

由于图像的运动方式各不相同,可采用不同的运动模型来表示。对于相邻的两帧图像,常从平移、旋转和缩放等方面来考虑两者的相对变化。图3-5表示了第T帧图像与第T+1帧图像之间的平移、旋转和缩放变化。

如果图像只有平移运动,那么使用平移模型:
在这里插入图片描述
其中p1、p0分别是当前帧和参考帧中对应的坐标,T是二维平移量。当图像具有平移旋转和缩放的变化时,运动模型为:
在这里插入图片描述

其中T是二维平移矢量,s是变焦系数,。Re是正交的旋转矩阵。即为
在这里插入图片描述

当图像具有扭转变化时,需要使用6参数的模型才可以表示扭转的变化

在这里插入图片描述

针对于视频稳像技术而言,由于相邻两帧图像的间隔很短,几乎没有扭转变化,所以一般采用平移、旋转加缩放的模型对其运动进行建模。

电子稳像

经典的电子稳像包含3个步骤:

  1.  全局运动估计
    
  2.  运动补偿
    
  3.  图像生成
    

全局运动一般指的是视频中背景的运动。在做全局运动估计时,一个难点是如何获得准确的运动信息,排除局部运动等各种干扰的影响。主要途径有微分方法和特征点对应法。

运动补偿是指对全局运动进行修正,使主观运动与抖动分离,是视频稳像的实质所在。如图1所示其目标是生成平滑的运动。运动补偿分为2 类:

  1.  基于参数滤波;基于参数滤波是指把描述运动的参数看成需要的主观运动和加性抖动的叠加,采用一定的滤波方法使得加性噪声运动被抑制,如采用概率模型的Kalman 滤波。
    
  2.  基于轨迹平滑。基于轨迹平滑则将摄像机的运动轨迹看成带噪声的运动轨迹,采用相应的平滑方法来去除高频噪声。
    

在这里插入图片描述

图像生成是稳定算法的后续阶段,其目标是根据补偿后的运动生成稳定视频输出流,涉及到图像拼接、去模糊、融合等技术。相对简单的实现是输出与输入帧一对一变换,如图2所示。在这种模式下,输出视频时会出现空白区域。许多学者也研究了如何保持图像精度(全帧输出)。通常的方法是通过相邻帧的拼接来获得全帧输出,其缺点是可能会使得拼接区域过渡不连续、不自然。在图像生成时另一个思路是把这个过程看成一个渲染生成的过程,其思想是综合图像信息,在此基础上根据特定的约束和一定的准则生成图像,而不是局限于图像的一一对应关系。如图3所示,该方法不是一对一的图像变换,而是基于一个子序列。将子序列送渲染系统,经过插值、融合等操作,生成不同视点的输出序列。这种方法的优点是生成的视频序列信息更全,也有更好的连贯性与视觉效果。

在这里插入图片描述

补充:

根据算法中运动估计方式的不同,数字稳像可分为2D稳像算法和3D稳像算法。

  1.  2D稳像算法通过估计相邻帧图像间的平移、旋转、缩放等参数来确定运动矢量。这些参数计算了在二维空间内图像之间的变化,将图像内所有点旳运动方式设定为仅在平面上的移动。2D算法的模型比较简单,对于大部分运动情况比较简单的视频可以成功得到稳定的输出结果。2D算法鲁棒性较高,而且容易达到实时处理的要求。但是2D算法无法解决视频中普遍存在的视差问题,也无法计算出图像运动的深度信息以得出理想的摄像头运动路径。视差就是从有一定距离的两个点上观察同一个目标所产生的方向差异,图1.1为视差示意图。
    
  2.  3D算法利用多帧图像数据构建3D点云,经过数据分析可以计算深度信息,并针对图像中不同区域的运动方式差异釆取不同的补偿方式,以解决视差产生的问题。3D稳像利用丰富的视频信息,可以达到较为理想的稳像效果并模拟合适的摄像头运动路径,但3D算法运算量较大,比较难以达到实时处理要求,而且鲁棒性略差。在后处理方式中3D算法优势明显。
    

在这里插入图片描述

  • 这种结果的可视化代码,在github
    中可以找到实现,比较形象的能够表达想要表达的意思。
    在这里插入图片描述

说明:以上内容均摘抄自下列3篇文章中,仅用于学术交流。

陈启立, 宋利, 余松煜. 视频稳像技术综述[J]. 电视技术, 2011, 35(7):15-17.

赵菲. 视频稳像技术研究[D]. 国防科学技术大学, 2007.

李棱铱. 基于块匹配和局部子空间的视频稳像方法研究[D]. 大连理工大学, 2015.
————————————————
版权声明:本文为CSDN博主「AI视觉网奇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jacke121/article/details/80002423

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

秒杀系统常见问题—如何避免库存超卖?

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 先看问题 首先上一串代码 …

Linux SUID提权脏牛提权

SUID提权 suid就是set user id 。设置了SUID后,文件启动的时候就会以root的权限去运行。就是一个普通用户运行的时候,因为有SUID,所以用root权限去运行它。 加SUID权限chmod ux 这里开始复现。 上传Linux提权信息检测脚本LinEnum find …

堆及其实现

目录 一:堆的概念及结构 1.概念 2.堆的性质 二:堆的实现 1.堆的构建 2.堆的销毁 3.数据的交换 4.堆的插入 5.堆的判空 6.堆的删除 7.取堆顶的数据 8.堆的数据个数 9.示例 三:完整的代码 一&#xff…

十、数据仓库详细介绍(数据质量)理论与经验

数据质量管理是对数据从计划、收集、记录、存储、回收、分析和展示生命周期的每个阶段里可能引发的数据质量问题,进行识别、度量、监控、预警等一系列管理活动,并通过改善和提高组织的管理水平使得数据质量获得进一步提高。数据质量管理的终极目标是通过…

会声会影2023最新完整版免费下载

会声会影2023操作简单,功能同样强大!会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具,如调色、遮罩、绿幕抠像、运动追踪、分屏创建器,满足更高标准的视频需求。这款软件上手操作简单易学,就算你在…

Linux之进程管理类命令

进程管理类命令 ps:查看当前系统进程状态 1)基本语法 语法说明ps aux查看系统中所有进程ps -ef可以查看父子进程之间的关系 2)选项说明 选项说明a列出带有终端的所有用户的进程x列出当前用户的所有进程,包括没有终端的进程u面…

C语言的一些杂记6

实现矩阵序号转置的三种方式 for (i 0; i < row * col; i)t[i / row][i % row] m[i % row][i / row];for (i 0; i < row; i)for (j 0; j < col; j)t[j][i] m[i][j];for (i 0; i < row; i)for (j 0; j < col; j)*(*(t j) i) *(*(m i) j); 变相数组 …

关于 arduino 中的 map(x, a, b,c,d)函数

函数名称&#xff1a;map() 包含形参&#xff1a; value&#xff1a;需要映射的值fromLow&#xff1a;输入值的最小值fromHigh&#xff1a;输入值的最大值toLow&#xff1a;输出值的最小值toHigh&#xff1a;输出值的最大值 功能&#xff1a;将一个值从一个范围映射到另一个…

【环境安装】Linux环境中docker安装redis

一、找到一个合适的docker的redis的版本 可以去docker hub中去找一下 https://link.juejin.cn/?targethttps%3A%2F%2Fhub.docker.com%2F_%2Fredis%3Ftab%3Dtags 二、使用docker安装redis 我这里安装了具体的某个版本 docker pull redis // 下载最新版Redis镜像 (等同于 : d…

UAS协议说明

1 概述 UAS(USB Attached SCSI)是一种位于SCSI协议框架下传输层的一种协议&#xff0c;其作用是通过基于USB的应用层协议约定&#xff0c;将SCSI的协议数据(Protocol Data Unit)用USB进行封装&#xff0c;从而实现使用USB物理连接进行SCSI协议通信的方式。 UAS实际上定义了两…

wireshark网络抓包详解

一、简介 Wireshark是一款非常流行的网络封包分析软件&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。 为了安全考虑&#xff0c;wireshark只能查看封包&#xff0c;而不能修改封包的内容&#xff0c;或者发送封包。 wireshark能获取HTTP&#xff0c;也…

【Android】(最新)跑马灯文字水平滚动(79/100)

先上效果&#xff1a; Android系统中TextView实现跑马灯效果&#xff0c;必须具备以下几个条件&#xff1a; android:singleLine“true”android:ellipsize“marquee”android:marqueeRepeatLimit“marquee_forever”TextView必须单行显示&#xff0c;即内容必须超出TextView…

Jetpack Compose 实现了一个丝滑流畅的页面展开和关闭的效果动画

Jetpack Compose 将动画实现的门槛降低了&#xff0c;不过Compose目前还不支持共享元素过渡。 (上篇文章Jetpack Compose开发的本地笔记本)的动画效果的实现 转跳前的准备工作 定义State枚举类来表示页面的三种状态: Closing(关闭状态) Closed(关闭完成状态) Opening(展开状…

找不到vcruntime140.dll,无法继续执行代码?多种解决方法解析

找不到vcruntime140.dll,无法继续执行代码&#xff1f;当你在尝试运行某个程序时&#xff0c;突然弹出一条错误提示框&#xff0c;告诉你无法继续执行代码&#xff0c;因为找不到vcruntime140.dll。这个问题很常见&#xff0c;但是它可能会让你感到困惑和疑惑。这篇文章将详细介…

chatgpt赋能Python-python_numpy遍历

Python NumPy遍历&#xff1a;使用高效的方式为数据科学家节省时间和精力 Python语言在数据科学领域中的地位越来越重要&#xff0c;并成为了数据科学家的首选语言之一。在解决数据问题时&#xff0c;NumPy模块是Python程序员经常使用的一个重要库。NumPy提供了快速的数组操作…

【大数据实训】—Hadoop开发环境搭建(一)

【大数据实训】—Hadoop开发环境搭建&#xff08;一&#xff09; 第一关、任务描述 本关任务&#xff1a;配置JavaJDK。 相关知识 配置开发环境是我们学习一门IT技术的第一步&#xff0c;Hadoop是基于Java开发的&#xff0c;所以我们学习Hadoop之前需要在Linux系统中配置Jav…

Flowable钉钉对接005-完成钉钉任务

企业中有自己的业务系统&#xff0c;审批都在业务系统中审批&#xff0c;如何结合移动办公的开放平台实现统一审批至关重要。 场景很简单&#xff0c;自己的系统中可以审批&#xff0c;钉钉上也可以审批&#xff0c;使用H5来适配&#xff0c;统一待办任务 统一待办审批 目标&am…

python获取tx弹幕数据并制作词云图

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 知识点介绍: 爬虫基本思路流程 requests模块的使用 pandas读取表格数据 环境介绍: 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 模块使用&#xff1a; requests >>> pip install requests pa…

​年轻人的情绪,都藏在知乎的短故事里

“谢邀&#xff0c;与世界分享我刚编的故事。” 这是一句在知乎被调侃的老梗。它源自于知乎上有众多隐匿的大佬&#xff0c;他们经历过各种奇闻轶事&#xff0c;也乐于分享传奇的人生经历&#xff0c;而这其间&#xff0c;很多真假难辨的事迹&#xff0c;也被很多用户笑称可以当…

这几款好用的软件分享给你

软件一&#xff1a;Handbrake Handbrake是一款免费开源的视频转码软件&#xff0c;适用于Mac、Windows和Linux系统。它可以将几乎所有视频格式转换为其他格式&#xff0c;包括MP4、MKV、AVI等等。作为一个强大的视频编码器&#xff0c;它可以压缩视频大小&#xff0c;并提供多…