银河1331官网这一系列连续变化的信息不断“流过”视网膜(即图像平面)

当前位置:1331银河网站登录 > 银河1331官网 > 银河1331官网这一系列连续变化的信息不断“流过”视网膜(即图像平面)
作者: 1331银河网站登录|来源: http://www.renohayek.com|栏目:银河1331官网

文章关键词:1331银河网站登录,光流

  在无人机上光流定位通常是借助于无人机底部的一个摄像头采集图像数据,然后采用光流算法计算两帧图像的位移,进而实现对无人机的定位,这种定位手段配合GPS可以在室外实现对无人机的精准控制,并且在市内没有GPS信号的时候,也可以实现对无人机的高精度的定位,实现更加平稳的控制。

  其中 I(x,y,t)表示在时间dt后移动到第二帧图像(x+dx,y+dy)的位置,采用泰勒级数对两边进行展开,消去相同的项,就可以得到如下方程:

  以上就是光流方程,其中fx和fy表示图像的梯度,ft表示时间梯度,但是上述方法是无法得到(u,v),因为一个等式无法求解两个未知数,为了解决这个问题,我们可以采用经典的lucas-Kanade方法来进行求解。

  在lucas-Kanade方法中,我们需要用到我们第二个假设了,即在目标点的邻域内所有的点都具有相似的运动,这就是lucas-kanade方法的核心,基于该假设,其利用一个3X3邻域中的9个点具有相同运动得到9个光流方程,然后采用最小二乘进行拟合求解,最终得到(u,v)如下:

  以上就是光流法计算像素点的移动速度的方法,在使用的时候,我们只需要对图像中的一些点去跟踪,采用上面的方法就可以计算得到光流向量,根据得到的光流向量,就可以进一步优化无人机的姿态控制,实现更加准确的控制。后期我们将在该理论的基础上,结合dragonboard 410c和OpenCV图像处理库,进一步介绍如何在dragonboard 410c上用opencv来实现光流跟踪。

  在dragonboard 410c上来用Python编程实现光流算法,虽然python语言编写出来的处理效率不高,但是便于我们理解整个光流算法应用方法,并且后续我们使用C或者其他高效率的语言来实现光流算法会变得更简单。

  在实现光流分析的过程中,我们使用cv2模块提供的算法接口来实现光流计算,在cv2中也就是OpenCV提供的Python接口,lucas-kanade算法被封装在cv2.calcOpticalFlowPyrLK()函数中,通过该接口可以方便的创建光流处理程序。但是在实现中我们首先要确定我们要跟踪的点,然后才能使用lucas-kanade算法来对这些点进行迭代跟踪,接下来参考cv2中提供的Python例程代码详细介绍利用cv2提供的光流计算处理函数接口如何完成基于光流的跟踪实现,其核心代码如下:

  首先为了方便调用cv2.calcOpticalFlowPyrLK算法,我们需要定义一个算法参数结构体,确定算法参数,用Python定义如下:

  同时在调用cv2.calcOpticalFlowPyrLK算法的时候我们还需要调用cv2.goodFeatureToTrack函数来确定需要跟踪的点,所以还需要给该接口传递一个参数,具体定义如下:

  完成参数定义后,就可以开始编写核心代码了,这里我们在读取视频帧的时候,根据前文的分析可以知道,光流算法需要依靠前后帧的数据来进行分析,所以在读取视频第一帧的时候,我们还需要在第0帧的时候进行初始化处理,这里使用便利frame_idx和detect_interval两个参数来进行控制,对第一帧进行处理,其中前者为帧数,后者为检测间隔,在这里初始化处理主要是需要找到适合跟踪的点,具体代码如下:

  完成第一帧处理后,就需要进一步对后续帧进行处理,这里处理其实就是一个循环迭代的过程,不断的根据前后帧来执行光流算法,调用cv2calcOpticalFlowPyrLK函数来计算光流数据,这里通过tracks参数来进行控制,核心代码如下:

  光流传感器通过IAS以一定速率连续采集物体表面图像,再由DSP对所产生的图像数字矩阵进行分析。由于相邻的两幅图像总会存在相同的特征通过对比这些特征点的位置变化信息,便可以判断出物体表面特征的平均运动,银河1331官网这个分析结果最终被转换为二维的坐标偏移量,并以像素数形式存储在特定的寄存器中,实现对运动物体的检测。

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

  当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(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等人对多种光流计算技术进行了总结,按照理论基础与数学方法的区别把它们分成四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。近年来神经动力学方法也颇受学者重视。

  原理倒是不复杂。就像你去一个陌生的地方赴约找不到地方,打电话问个显眼点的地标做参考即可。目的地在xx大厦前面?后面?左面?右面?如果要求你位于xx大厦正北方,保持xx米距离。你就实现了无人机的光流定高功能。

  图像上每个像素可以转换为看到的点在相机坐标系下的射线方向(两个自由度)。光流就是两帧图像之间像素的映射关系,每个点对应一个向量(二维)。光流场和相机运动(六个自由度),环境中点的位置(n*3个自由度,n为点的个数)有关。

  一帧图像包含已知了每个点的方向:n*2个已知量,光流场2*n个方程约束了剩下的n+6个未知量。

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!