车流检测之halcon光流法算法实现

先上代码:

* This example program shows how to use optical_flow_mg to compute the optical flow in an image sequence and how to segment the optical flow.
*这个示例程序显示了如何使用._flow_mg来计算图像序列中的光流,以及如何分割光流。
dev_update_off ()
dev_close_window ()
* Initialize the image sequence.
初始化图像序列
read_image (Image1, 'xing/xing000')
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
* Set the display parameters for the vector field.
设置现实的矢量场参数
dev_set_paint (['vector_field',6,1,2])
定义灰度值输出模型,
dev_set_draw ('margin')
for I := 1 to 587 by 1
    * Read the current image of the image sequence.
     读连续的图像序列
    read_image (Image2, 'xing/xing'+I$'03')
    * Compute the optical flow.
      计算光流
    optical_flow_mg (Image1, Image2, VectorField, 'fdrig', 0.8, 1, 8, 5, 'default_parameters', 'accurate')
*计算两幅图片的光流场。
参数:1&2是输入的两个单色图片序列的连续图片,
            3为输出的光流结果
           4是求取光流三种算法的选取其中的一种
           5高斯平滑初始偏差初始值
           6积分滤波偏差初始值
           7平滑项在数据项中的权重
           8梯度恒定性相对于灰度值恒定性的权重
           9多栅算法的名字
          10多栅算法的变量 
    * Segment the optical flow vector field.
    分割矢量场
    threshold (VectorField, Region, 1, 10000)
    * Display the current image of the sequence.  Note that this means that the optical flow vectors will also be displayed at the "end" of the movementof the objects in the image.
    显示序列的当前图像。注意,这意味着光流矢量也将显示在图像中物体运动的“末端”。
    dev_display (Image2)
    * Display the optical flow.
    dev_set_color ('yellow')
    dev_set_line_width (1)
    dev_display (VectorField)
    * Display the segmented optical flow.
    dev_set_color ('green')
    dev_set_line_width (3)
    dev_display (Region)
    * Copy the current image to the previous image of the sequence.
    *将当前图像复制到序列的前一个图像。
    copy_obj (Image2, Image1, 1, 1)
endfor


背景介绍

 

光流的概念是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://www.jianshu.com/p/f91a8a519a50
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864