介绍家乡的html源代码_Optical Flow介绍与代码实现

2023-11-01 11:20

本文主要是介绍介绍家乡的html源代码_Optical Flow介绍与代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

f25ef6bd860aae8ecdc356970b19904c.png

Optical Flow介绍与代码实现

介绍

首先我们先来介绍一下Optical Flow是个什么东西, 在浏览器的搜索框框里面我们输入"Optical flow"可以看到维基百科的解释:

光流(Optical flow or optic flow)是关于视域中的物体运动检测中的概念。用来描述相对于观察者的运动所造成的观测目标、表面或边缘的运动。

Optical flow 是一个概念, 描述的是一个相对于观测者的运动,这个运动是观测造成的,就是说,我们眼睛的目光和物体保持相对静止就没有光流运动啦. 似乎是个物理上面的东西, 这个网址 "http://people.csail.mit.edu/celiu/motionAnnotation/whatismotion.html"提出了一个问题 ":

What is motion?"对两个观点进行了辩论:

  • 1, " motion is the physical movement of pixels, and therefore motion has to be measured in a physical way. "
  • 2, " motion is human percept--motion is what we perceive in our brain, something we can sense and communicate."
  • 然后贴了下面这个图

5a70d29f44c3bd9d1a8e8276f860ed1f.png
Fig1 http://www. ritsumei.ac.jp/~akitaok a/index-e.html

我们人类可以从上面的静态图中感受到运动! 由此联想到计算机视觉系统是如何做的?

If the ultimate goal of computer vision is to let the computer see what humans perceive, then it is certainly the right way to let humans teach computer how to see the world. Our human-assisted motion annotation serves exactly for this purpose. Indeed, we shall show you that (a) humans' annotations are very consistent, and (b) human's annotations are consistent with other ground-truth data.

很容易发现, 只有在我们的眼睛(准确的是目光)移动的时候,我们才能感受到运动,那么眼睛移动引起了什么变化喃, 貌似有亮度, (角度)视角,这样子我们岂不是就可以估计相对运动啦. 是的嘛, 光流就是来估计运动的的嘛,,(这么简单的原理,为什么我就没有提出来喃 233).

言归正传

光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。运动场,其实就是物体在三维真实世界中的运动;光流场,是运动场在二维图像平面上(人的眼睛或者摄像头)的投影。那通俗的讲就是通过一个图片序列,把每张图像中每个像素的运动速度和运动方向找出来就是光流场。那怎么找呢?咱们直观理解肯定是:第t帧的时候A点的位置是(x1, y1),那么我们在第t+1帧的时候再找到A点,假如它的位置是(x2,y2),那么我们就可以确定A点的运动了:

(ux, vy) = (x2, y2) - (x1,y1)。

那怎么知道第t+1帧的时候A点的位置呢? 这就存在很多的光流计算方法了。 1981年,Horn和Schunck创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法。人们基于不同的理论基础提出各种光流计算方法,算法性能各有不同。Barron等人对多种光流计算技术进行了总结,按照理论基础与数学方法的区别把它们分成四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。近年来神经动力学方法也颇受学者重视。

贴自 https:// blog.csdn.net/zouxy09/a rticle/details/8683859

光流的测量

101adeb241d9ae20ac5dcb81f1926b9c.png
贴自 https:// zh.wikipedia.org/wiki/% E5%85%89%E6%B5%81%E6%B3%95

几种测定方法

这里列举几个OpenCv实现了的测定算法:

  • Lucas–Kanade method

Lucas-Kanade方法是由Bruce D. Lucas和Takeo Kanade开发的一种广泛使用的光流估计差分方法.它假设流在所考虑的像素的局部邻域中基本恒定,并且通过最小二乘准则解出该邻域中的所有像素的基本光流方程. openCV 的API是 calcOpticalFlowPyrLK.

https:// en.wikipedia.org/wiki/L ucas%E2%80%93Kanade_method
点下面这个链接,不错的理论解释(中文) http:// image.sciencenet.cn/old data/kexue.com.cn/upload/blog/file/2010/9/2010929122517964628.pdf
  • The Gunnar-Farneback optical flow

用Gunnar Farneback 的算法计算稠密光流(即图像上所有像素点的光流都计算出来)。它的相关论文是:"Two-Frame Motion Estimation Based on PolynomialExpansion"

opencv 的API 是 calcOpticalFlowFarneback.

论文地址: http://www. diva-portal.org/smash/g et/diva2:273847/FULLTEXT01.pdf
  • block matching method

依赖于块匹配方法,OpenCv的API 是: CalcOpticalFlowBM.

  • Horn–Schunck method 用Horn-Schunck 的算法计算稠密光流。OpenCv的API是 CalcOpticalFlowHS.
  • SimpleFlow
项目网站(源代码) http:// graphics.berkeley.edu/p apers/Tao-SAN-2012-05/

OpenCv的API是 calcOpticalFlowSF.

代码演示

对于代码,这里只演示计算量更少,更加适用于SLAM系统的Lucas–Kanade method. 我们首先需要使用 cv2.goodFeaturesToTrack()来寻找角点,然后在使用Lucas–Kanade method进行运动跟踪。

python

#!/usr/bin/pythonimport numpy as np
import cv2# opencv-3.1.0/samples/data/768x576.avi
cap = cv2.VideoCapture('768x576.avi')# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 )# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),maxLevel = 2,criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# Create some random colors
color = np.random.randint(0,255,(100,3))# Take first frame and find corners in it
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)while(1):ret,frame = cap.read()if ret is True:print retframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# calculate optical flowp1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# Select good pointsgood_new = p1[st==1]good_old = p0[st==1]# draw the tracksfor i,(new,old) in enumerate(zip(good_new,good_old)):a,b = new.ravel()c,d = old.ravel()mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)img = cv2.add(frame,mask)cv2.imshow('frame',img)k = cv2.waitKey(30) & 0xffif k == 27:break# Now update the previous frame and previous pointsold_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)else:breakcv2.destroyAllWindows()
cap.release()

效果图

312a46d05c619b02ca4d5b46b672e347.png

这个理论由于基于一个很强的亮度不变的假设,因此具有较大的局限性,只能用于估计很小的运动。

参考文献

* Application of local optical flow methods to high-velocity free-surface flows: Validation and application to stepped chutes :http://staff.civil.uq.edu.au/h.chanson/reprints/Zhang_Chanson_etfs_2018.pdf (介绍了主流的几种光流算法)

* https://blog.csdn.net/zouxy09/article/details/8683859(光流Optical Flow介绍与OpenCV实现)


*http://image.sciencenet.cn/olddata/kexue.com.cn/upload/blog/file/2010/9/2010929122517964628.pdf (Lucas–Kanade method的中文理论推导)http://vision.middlebury.edu/flow/floweval-ijcv2011.pdf (同一)

这篇关于介绍家乡的html源代码_Optical Flow介绍与代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322601

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景