使用光流进行相机运动估计

news2024/9/20 15:05:41

文章目录

  • 基本相机移动
  • 区分动作的核心思想
  • 了解代码
  • 参考

基本相机移动

从我的非专业角度来看,尽管已知的摄像机运动有多种,但我们应该概述其中三种:

  • 一种是将摄像机安装在轨道上并移动——卡车、移动式摄影车、基座
  • 摄像机停留在同一位置并旋转——平移、倾斜
  • 改变变焦镜头的焦距——变焦

我们甚至可以更进一步,只保留其中两个:

  • 摄影机移动——卡车、移动摄影车、基座

  • 相机保持在同一位置 — 变焦、平移、倾斜

在这篇文章中,我们将使用平移和推车的示例来介绍区分移动的概念。对于其他组合(例如变焦和推车),可能需要采用不同的方法。

区分动作的核心思想

当我之前谈到不同的观点时,我的意思是在编写代码之前,我们需要弄清楚如何解释 panning 和 trucking 之间的区别。对于这两个,区别不是那么明显。

卡车运输时,场景中的所有物体都以相同的速度移动。然而,在平移时,距离摄像机较近的物体移动速度比距离摄像机较远的物体快。

因此,我们的想法是比较视频中不同物体的速度差异。以下是我逐步介绍的方法:

  • 计算一对帧上每个点的光流和平移值
  • 从排序后的翻译值两侧截断一些值——以消除异常值
  • 对其余值进行聚类(我使用 3 个聚类来将值彼此进一步分离)
  • 计算最小和最大聚类中心之间的差异
  • 如果差值大于某个阈值,视频就会发生平移,否则就会发生卡车移动。

它的效果出奇地好,但不幸的是也有其局限性。

视频中的某些物体在使用光流分析时可能非常棘手 - 例如天空或水。这些物体不会为算法提供要监控的精确点位置。
在这里插入图片描述

它还会受到视频中移动物体的影响,例如,如果视频中的人群四处奔跑或近景中只有一个人。因此,基本上,当有很多点以不同的速度向不同的方向移动时,它就会受到影响。
在这里插入图片描述

解决这一问题的方法之一是从帧中移除移动物体。方法是使用图像分割模型遮挡不需要的区域。也就是说,我们不考虑包含这些物体的区域的光流。

最后但并非最不重要的一点是,前景和背景之间的距离越远,算法的效果就越好。在靠近墙壁拍摄时,即使是人也很难确定其运动轨迹。在上面的例子中就很好地体现了这一点。

了解代码

OpenCV 视频读写入门指南

本节将对那些对想法的实现感兴趣的人和开始学习 OpenCV 的人有所帮助。本帖的实际代码可在此处找到。

该代码包含对帧中每个点的模式角和平移值的计算。这些值可用于确定摄像机运动的方向和速度。顺便说一下,在计算角度时,我们会记住原点的位置是在左下角(而不是 OpenCV 中的左上角)–这样似乎更方便。

假设我们要处理一段视频,并确定摄像机是如何移动的。我们想编写一段新视频,将算法的工作结果(或绘制光流本身)直接写入视频。

首先,我们需要截取一段视频,从中读取帧。

cap = cv.VideoCapture(os.path.join(path, filename))

此类将视频文件的路径或摄像机的 ID 作为输入。要从对象读取帧,我们使用以下命令:

ret, frame = cap.read()

该方法返回两个值。第一个是布尔值,如果读取成功则为 True(否则为 False),第二个是返回值(例如,如果相机已断开连接,或者视频文件中没有更多帧,则为 None)

我们还可以使用同一对象调用“get”方法。这个方法可以给我们提供很多信息。例如,我们可以提取原始视频的FPS值。

cap.get(cv.CAP_PROP_FPS)

以下是我们可以使用此方法提取的信息的完整列表。

outputStream = cv.VideoWriter(save_name, codec, frameRate, (int(cap.get(3)),int(cap.get(4))))

我们还需要事先初始化 VideoWriter 类对象。我们需要从原始视频中提取 fps 值和帧大小值。选择正确的编解码器可能有点棘手。如果您编写的视频是空的 - 您可以通过调整编解码器或输出视频格式进行实验。 这是有关保存视频的 OpenCV 教程。对我来说,工作的价值观如下:

fps = int(cap.get(cv.CAP_PROP_FPS))
codec = cv.VideoWriter_fourcc(*'XVID')
frame_size = (int(cap.get(3)),int(cap.get(4))
outputStream = cv.VideoWriter("video.avi", codec, fps, frame_size)

最后,我们发现了一些有趣的事情。有多种算法可用于计算光流。我们将使用 Gunnar Farneback 算法来计算密集光流。如果您想了解该算法如何工作的细节,可以阅读这篇文章。

flow = cv.calcOpticalFlowFarneback(img1, img2, None, 0.5, 3, 15, 3, 5, 1.2, 0)

该算法需要指定几个参数。您可以尝试选择适合您情况的值,也可以使用提供的一组值来更快地迭代整个过程。 这里是每个参数的描述。

您可以在此处找到其余代码。同时,这是两个不同视频的结果。条件几乎是理想的,因此算法正确运行也就不足为奇了。

参考

https://medium.com/@ikunyankin/camera-motion-estimation-using-optical-flow-ce441d7ffec

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

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

相关文章

MySQL中的distinct和group by哪个效率更高?

前言 大家好,我是月夜枫~~ 一、distinct和group by的区别 1.1.作用方式和应用场景 ‌group by和‌distinct的主要区别在于它们的作用方式和应用场景。 group by用于对数据进行分组和聚合操作,通常与聚合函数(如COUNT、SUM、AVG等&#xf…

学习分享:微软Edge浏览器全解析(请按需收藏)

成长路上不孤单😊【14后小学生一枚,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊】 微软Edge浏览器是一款由微软开发的现代网页浏览…

Python(PyTorch)硅光电倍增管和量化感知训练亚光子算法验证

🎯要点 🎯亚光子光神经网络矩阵计算 | 🎯光学扇入计算向量点积 | 🎯表征测量确定不同光子数量下计算准确度 | 🎯训练全连接多层感知器基准测试光神经网络算法数字识别 | 🎯物理验证光学设备设置 | &#x…

【闭包】闭包知识点总结

一、什么是闭包? ——官方解释: 一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域 ——简单解释: 👉 闭包内层函数可以引用的外层函数的变量 ——闭包优势 可以保护内部变量,不让外…

黑马前端——days11_综合案例

文章目录 一、首页1、页面开头2、快捷导航2.1 页面框架2.2 格式文件 3、头部模块3.1 页面框架3.2 格式文件 4、导航栏4.1 页面框架4.2 格式文件 5、页面主模块5.1 页面框架5.2 格式文件 6、推荐模块6.1 页面框架6.2 格式文件 7、楼层模块7.1 页面框架7.2 格式文件 8、页面底部8…

webrtc学习笔记2

音视频采集和播放 打开摄像头并将画面显示到页面 1. 初始化button、video控件 2. 绑定“打开摄像头”响应事件onOpenCamera 3. 如果要打开摄像头则点击 “打开摄像头”按钮,以触发onOpenCamera事件的调用 4. 当触发onOpenCamera调用时 a. 设置约束条件&#xff0c…

虚幻UE5安装报错误代码:SU-PQR5

找到图标的快捷方式 “Epic Games Launcher”右键属性,在目标最后添加-SkipBuildPatchPrereq,如下图: 最后,见证奇迹成功打开软件,可以继续安装啦。 参考资料: 【图片】求教各位大佬--错误代码SU-PQR5【ep…

Linux网络编程—socket、bind

一、socket创建套接字 socket是用来创建网络通信或本地通信的套接字&#xff0c;跟文件有关&#xff1a;告诉系统&#xff0c;PCB&#xff08;进程控制块&#xff09;控制的数据应该向哪个套接字写入、或读取&#xff1b;这个套接字是在TCP/IP协议下运行的 #include <sys/t…

配置MySQL主从,配置MySQL主主 +keeplive高可用

在大数据-Hadoop体系中 配置MySQL主主keeplive高可用 注意&#xff1a;这个是我两年前的word文档&#xff0c;可以当作参考文档有个思路参考一下&#xff0c;但是里面可能有些地方有误 另外 :关于一些企业级实战技术可以参考这篇mysql 物理备份 MySQL 全量备份 增量备份 差异…

NFTScan 正式上线 AI Search 浏览器,实现 NFT 数据双重搜索功能

近日&#xff0c;NFT 数据基础设施服务商 NFTScan 正式对外发布了 AI Search 浏览器&#xff0c;这一创新工具旨在为 NFT 生态中的开发者和用户提供简洁高效的 NFT 数据搜索与查询服务。NFTScan 的这一举措不仅帮助用户更方便地访问相关的 NFT 数据&#xff0c;还大幅提升了数据…

STM32F407ZGT6无操作系统移植lwip2.1.3,,具备DHCP功能

1.工程添加网络库文件 (1).拷贝文件夹 解压en.stsw-stm32070.zip压缩包,把STM32F4x7_ETH_LwIP_V1.1.1\Libraries\STM32F4x7_ETH_Driver文件夹下的inc和src文件夹拷贝到 STM32F407\FWLIB\STM32F4x7_ETH_Driver文件夹目录下&#xff1a; (2).重命名头文件 进入STM32F407\FWLI…

【TM1638不能成功读回按键值】

8led8按键8数码管。主函数调用TM1638_ReadData2&#xff0c;打印了返回值&#xff0c;无论是否按键&#xff0c;都一直打印255&#xff0c;为什么全是1&#xff0c;看来读数据函数有问题啊。 u8 TM1638_ReadData2(void) {uint8_t i;uint8_t temp0x00;TM1638_DIOModeInput();/…

前端读取response.headers异常:Cannot read properties of undefined (reading ‘split‘)

[TOC](前端读取response.headers异常:Cannot read properties of undefined (reading ‘split’) ) 前端读取response.headers异常 Cannot read properties of undefined (reading ‘split’) TypeError: Cannot read properties of undefined (reading ‘split’) 报错解释&a…

如何修改计算机ip地址?几招教你轻松改

在日常使用计算机的过程中&#xff0c;有时我们需要修改计算机的IP地址&#xff0c;无论是出于网络安全、网络管理还是其他特定需求。然而&#xff0c;对于非专业人士来说&#xff0c;这一过程可能显得复杂且充满挑战。但别担心&#xff0c;本文将带您了解IP地址基础知识&#…

day04 --js的常用对象、BOM对象和DOM对象

一、常用对象 1.1 数组 1.创建数组:let arr [1,2,3]; let arr new Array(1,2,3);注意&#xff1a;JS数组不区分数据类型&#xff0c;而且其长度可以随意改变&#xff0c;因此JS数组类似于Java中的集合 ​ 2.数组常用方法:length:这是一个属性&#xff0c;用于获取数组长度fo…

以「垂直模型」引领AIGC商业化落地,FancyTech的技术路径是什么?

我们正在见证又一轮技术革新&#xff0c;这一次是 AIGC 为个体提供表达自我的工具&#xff0c;让创作变得更加容易和普及&#xff0c;但背后的推动力却并不是「大」模型。 点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 两年以来&#xff0c;AIGC 技术的发…

快速备份与检索ChatGPT对话记录,以及便捷关闭聊天历史教程

近期&#xff0c;ChatGPT 用户遭遇了一系列对话记录意外丢失的事件&#xff0c;引发了广泛的关注和不便。用户们对于重要聊天记录的安全性表示担忧&#xff0c;害怕珍贵的交流内容会不翼而飞。 令人欣慰的是&#xff0c;OpenAI 在2023年4月11日宣布推出了一项新的功能——Chat…

雨云美国二区E5v2服务器测评(非广告)

注&#xff1a;本文非广告&#xff0c;非推广 本文长期更新地址&#xff1a; 雨云美国二区E5v2服务器测评&#xff08;非广告&#xff09;-星零岁的博客https://blog.0xwl.com/13594.html 今天来测评一下雨云美国二区v2服务器。我测试的这台配置是4-8&#xff0c; 35 M上传&a…

SpringBoot教程(二十三) | SpringBoot实现分布式定时任务之xxl-job

SpringBoot教程&#xff08;二十三&#xff09; | SpringBoot实现分布式定时任务之xxl-job 简介一、前置条件&#xff1a;需要搭建调度中心1、先下载调度中心源码2、修改配置文件3、启动项目4、进行访问5、打包部署&#xff08;上正式&#xff09; 二、SpringBoot集成Xxl-Job1.…

水利机械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

在当今这个科技日新月异的时代&#xff0c;水利机械行业正经历着一场深刻的变革&#xff0c;其中5G智能制造工厂物联数字孪生平台的引入&#xff0c;无疑是推动制造业数字化转型的重要驱动力。工业物联数字孪生平台是智能制造工厂的核心组成部分&#xff0c;它基于物理世界的真…