基于matlab使用点特征匹配稳定从抖动平台捕获的视频(附源码)

news2024/11/25 6:40:52

一、前言

此示例演示如何稳定从抖动平台捕获的视频。稳定视频的一种方法是跟踪图像中的显著特征,并将其用作锚点以消除与其相关的所有扰动。但是,此过程必须了解第一个视频帧中这种显着特征的位置。在此示例中,我们探索了一种无需任何此类先验知识即可工作的视频稳定方法。相反,它会自动搜索视频序列中的“背景平面”,并使用其观察到的失真来校正摄像机运动。

此稳定算法包括两个步骤。首先,我们使用应用于两个图像之间的点对应函数来确定视频序列的所有相邻帧之间的仿射图像转换。其次,我们扭曲视频帧以实现稳定的视频。

二、第 1 步。从影片文件中读取帧

在这里,我们读取视频序列的前两帧。我们将它们读取为强度图像,因为稳定算法不需要颜色,并且因为使用灰度图像可以提高速度。下面我们并排显示两个帧,并生成红青色复合来说明它们之间的像素差异。两个框架之间显然存在较大的垂直和水平偏移。

三、第 2 步。从每一帧中收集突出点

我们的目标是确定一个能够纠正两帧之间失真的变换。作为输入,我们必须为这个函数提供两个帧之间的一组点对应关系。为了生成这些对应关系,我们首先从两个帧中收集兴趣点,然后选择它们之间可能的对应关系。

在此步骤中,我们为每个帧生成这些候选点。为了最好地使这些点在另一帧中具有相应的点,我们需要围绕突出的图像特征(如角)的点。

从两个帧中检测到的点如下图所示。观察其中有多少个覆盖了相同的影像要素,例如沿树线的点、大型路标的拐角和汽车的拐角。

四、第 3 步。选择点之间的对应关系

接下来,我们选择上面派生的点之间的对应关系。对于每个点,我们提取一个以它为中心的快速视网膜关键点(FREAK)描述符。我们在点之间使用的匹配成本是汉明距离,因为 FREAK 描述符是二进制的。帧 A 和帧 B 中的点假定匹配。请注意,没有唯一性约束,因此帧 B 中的点可以对应于帧 A 中的多个点。

匹配在当前帧和前一帧中找到的特征。由于 FREAK 描述符是二进制的,因此 matchFeatures 函数使用汉明距离来查找相应的点。下图显示了上面给出的相同颜色合成,但添加了来自 A 帧的点(红色)和来自帧 B 的点(绿色)。在点之间绘制黄线以显示通过上述过程选择的对应关系。其中许多对应关系是正确的,但也存在大量异常值。

五、第 4 步。从噪声对应估计变换

在上一步中获得的许多点对应都是不正确的。但是我们仍然可以使用 M 估计器 SAmple 共识 (MSAC) 算法得出两个图像之间几何变换的可靠估计,该算法是 RANSAC 算法的变体。MSAC 算法在estgeotform2d 函数中实现。当给定一组点对应时,此函数将搜索有效的内在对应关系。然后,它将从这些中得出仿射变换,使第一组点的内在与第二组的内在最匹配。此仿射变换将是以下形式的 3×3 矩阵:

参数一个定义变换的比例、旋转和切变效果,而参数t是翻译参数。此变换可用于扭曲图像,以便将其相应的要素移动到相同的图像位置。

仿射变换的一个限制是它只能改变成像平面。因此,它不适合找到3D场景拍摄的两帧之间的一般失真,例如从移动的汽车拍摄的视频。但它确实在我们将稍后描述的某些条件下起作用。

下面是一个颜色合成,显示帧 A 与重新投影的帧 B 叠加,以及重新投影的点对应关系。结果非常好,内在对应关系几乎完全重合。图像的核心都对齐良好,因此红青色复合在该区域几乎变成纯黑白。

请注意,内在的对应关系都在图像的背景中,而不是在前景中,前景本身没有对齐。这是因为背景要素足够远,以至于它们的行为就像在无限远的平面上一样。因此,即使仿射变换仅限于改变成像平面,这里也足以对齐两个图像的背景平面。此外,如果我们假设背景平面在帧之间没有移动或显着变化,那么这种转换实际上是在捕捉相机运动。因此,纠正此问题将稳定视频。只要摄像机在帧之间的运动足够小,或者相反,如果视频帧速率足够高,则此条件将保持不变。

六、第5步。变换近似和平滑

我们通过拟合上述获得的转换来展示下面的转换过程H具有刻度-旋转-平移等效物,HsRt.为了表明转换转换的误差最小,我们使用两种转换重新投影帧 B,并将下面的两个图像显示为红青色合成。由于图像显示为黑白,显然不同重新投影之间的像素差异可以忽略不计。

七、第 6 步。在完整视频上运行

现在我们应用上述步骤来平滑视频序列。在每一步,我们计算转换H在当前帧之间。我们将其拟合为 s-R-t 变换,描述了自第一帧以来的所有摄像机运动。平滑视频的最后两帧在视频播放器中显示为红青色合成。

在计算过程中,我们计算了原始视频帧和校正帧的平均值。这些平均值在下面并排显示。左图显示了原始输入帧的平均值,证明原始视频中存在大量失真。然而,右侧校正帧的平均值显示了几乎没有失真的图像核心。虽然前景细节变得模糊(这是汽车向前运动的必要结果),但这显示了稳定算法的有效性。

八、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

程序下载:基于matlab使用点特征匹配稳定从抖动平台捕获的视频资源-CSDN文库

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

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

相关文章

rz、sz常见报错怎么解决?

使用shell和mobaxterm 中上传下载文件遇到的问题 常见报错一: 首先要使用Ctrlx 来退出,或者等待一会; 然后重新输入sz 要下载的文件名 空格 ,然后按ctrl右键,选择如下选项 常见错误二: sz还有一些参数&#xff0…

java之路——带你了解Hibernate与基本过程

文章目录 前言一、Hibernate用来干嘛的二、Hibernate与mybatisHibernate的基本开发步骤 前言 Hibernate框架的发展可以追溯到2001年,它在过去的几年里获得了广泛的应用和持续的发展。 其中的发展演变: 初期版本(2001-2006年)&am…

记一次 JMeter 压测 HTTPS 性能问题

目录 前言: 问题背景 问题分析 切入点:垃圾回收 调整思路:为什么频繁 SSL 握手 问题验证 回归测试 源码验证 前言: 在进行性能测试时,JMeter是一个常用的工具,可以模拟大量并发用户来测试系统的负…

QT学习笔记3--信号和槽

作用 信号槽是用来连接信号的发出端和接收端,其本身是没有关联的。利用connect函数将两个端耦合在一起。 函数格式 connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽)) 实例 利用按键关…

MultiTimer 软件定时器扩展模块的研究与优化【原创】

文章目录 前言收获main.cMultiTimer.cMultiTimer.h 前言 博主花费几天时间研究了此开源软件定时器扩展模块代码,并参考别的博主讲解解决了定时器计数值会溢出的问题(很多博主写的文章并没有谈到这个计数溢出问题,我就想问一下看代码自己都不思…

MathType公式批量转换为Word自带公式的VBA实现及error ‘4198‘ 处理

VBA 纯新手,程序可能比较傻,大家将就看。有改进建议,欢迎留言 参考链接: 1、2种办法把MathType公式转换为Word公式 2、一键批量将mathtype公式转换成word自带公式-vba/vbnet_mathtype批量转word自带_一路向前的小Q的博客-CSDN博…

如何保证缓存与数据库的双写一致性?

分析? 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一 致性的问题,那么你如何解决一致性问题? 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情…

合同数智化如何助力地产企业实现变革“突围”?

从稳步发展到求新求变, 数智化成破局关键 近年来,随着宏观经济政策调整,在中央房住不炒的大基调下,房地产逐步回归居住属性。在这样的大背景下,针对不同类型的房地产企业,国家出台了不同的数字化转型指导文…

【Bio】头骨组成,及其剖切面

在总结这篇文章之前,我看过了一本书《认知觉醒》,里边有提到一个观点:我们不仅要去获取新知识,也要注重对新知识的“缝接”,这个过程也就是关联。这样,如沙粒般的新知识才能关联到一起,达到聚沙…

go get google.golang.org/grpc报错

win10环境,报错完整内容如下 go get google.golang.org/grpc: module google.golang.org/grpc: Get https://proxy.golang.org/google.golang.org/grpc/v/list: dial tcp [2404:6800:4012:3::2011]:443: connectex: A connection attempt failed because the conne…

Spring 的依赖注入(DI)

前言 欢迎来到本篇文章,书接上回,本篇说说 Spring 中的依赖注入,包括注入的方式,写法,该选择哪个注入方式以及可能出现的循环依赖问题等内容。 如果正在阅读的朋友还不清楚什么是「依赖」,建议先看看我第一…

34岁上岸,我终于圆了自己的考研梦

​ 大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动的作者。 ​ 虽然告诉自己要平静,但是当接到EMS录取通知书的那一刻,眼眶还是忍不住有些湿润。今年正好是是东北…

SpringBoot源码分析(1)--@SpringBootApplication注解使用和原理/SpringBoot的自动配置原理详解

文章目录 前言主启动类的配置1、SpringBootApplication注解1.1、SpringBootConfiguration注解验证启动类是否被注入到spring容器中 1.2、ComponentScan 注解ComponentScan 注解解析与路径扫描 1.3、EnableAutoConfiguration注解1.3.1、AutoConfigurationPackage注解1.3.2、Impo…

【MySQL】事务及其隔离性/隔离级别

目录 一、事务的概念 1、事务的四种特性 2、事务的作用 3、存储引擎对事务的支持 4、事务的提交方式 二、事务的启动、回滚与提交 1、准备工作:调整MySQL的默认隔离级别为最低/创建测试表 2、事务的启动、回滚与提交 3、启动事务后未commit,但是…

HTB-Pilgrimage

HTB-Pilgrimage 信息收集80端口立足emily -> root 信息收集 80端口 扫描目录发现存在.git。 通过scrabble获取网站的git文件。 有如下这些文件。 在index.php中使用了magick来处理图像。 正好我们靠git弄了一个,查看一下版本。 这个版本似乎有些不得了的东西…

Quiz 9: Dictionaries | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 9: Dictionaries 单选题(1-11)编程题Exercise 9.4 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach everyone the basics of programming computers using Python.…

conda的多线程下载工具mamba(解决Anaconda3 solving environment 巨慢的方法)

solving environment为什么会越来越慢? 根据原博的解释以及我查阅的相关资料,这是由于conda在新安装一个包或者更新包时需要搜索当前环境中所有的包的依赖空间,以找到满足所有依赖项的版本,随着用户安装的包越来越多,…

C#核心知识回顾——1.结构体、构造函数、GC、成员属性、索引器

1.结构体: 在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。例如我定义了一个结构体,它有两个变量,创建一个这个类型的结构体,通过一个变量名调用多个变量,这些变量可…

Layui时间范围选择器,添加【本周、本月、本季度、本年等常用时间快捷键】

文章目录 1. 界面实现2. JS具体实现2.1 第一种实现2.2 第二种实现 1. 界面实现 <input id"Date_select" type"text" class"form-control" placeholder"请选择时间范围" style"border-radius: 4px;" /><input id&qu…

RuoYi-Vue Swagger 上传文件接口

前言 RuoYi-Vue&#xff1a; v3.8.5swagger 1.6.2 &#xff08;https://github.com/swagger-api/swagger-core, https://gitee.com/mirrors/swagger-core&#xff09; Swagger 上传接口定义 ApiOperation(value "图片上传") PostMapping(value "/upload&qu…