HDevelop示例程序-optical_flow.hdev

应用范围: 安全系统

提示:这里可以添加系列文章的所有文章的目录

  1. coherence_enhancing_diff.hdev
  2. optical_flow.hdev
  3. optical_flow_bicycle.hdev
  4. optical_flow_hydraulic_engineering.hdev
  5. xing.hdev

提示:文章目录


前言

提示:这里可以添加本文要记录的大概内容:

这个示例程序演示了如何使用optical_flow_mg计算图像序列中的光流,以及如何对光流进行分割。


提示:以下是本篇文章正文内容

一、原示例程序

代码如下(示例):

* 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.
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 95 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')
    * 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 movement
    * of 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

二、程序解释

这个示例程序演示了如何使用optical_flow_mg计算图像序列中的光流,以及如何对光流进行分割。

  1. 关闭与初始化显示环境:首先关闭可能存在的窗口并关闭图形更新,以便提高处理速度。然后读取图像序列的第一帧xing000,并根据该图像的尺寸自动调整窗口大小,准备显示图像。
* 关闭图形界面的实时更新以加速处理
dev_update_off ()

* 关闭所有已打开的图像窗口
dev_close_window ()

* 初始化图像序列:读取第一帧图像
read_image (Image1, 'xing/xing000')

* 根据Image1的尺寸自动创建并打开一个新的窗口,用于显示图像
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)

* 设置向量场(即光流)的显示样式
dev_set_paint (['vector_field',6,1,2]) 
    - 'vector_field' 指定要显示的内容类型为向量场
    - 6 定义箭头的样式
    - 1 箭头长度与宽度的比例
    - 2 箭头头部的大小

* 设置绘图模式为在图像边缘留出空白边距
dev_set_draw ('margin')
  1. 循环处理图像序列:对于序列中的每一对连续图像(从xing001xing095)执行以下操作:
* 循环处理图像序列中的每一帧
for I := 1 to 95 by 1
/****************

此处省略,下面程序都在此循环中。

****************/
endfor
  • 读取当前图像:读取序列中的下一帧图像。
* 读取当前帧图像
    read_image (Image2, 'xing/xing' + I$'03') 
        - $'03' 表示如果I小于10,则在其前面补零至三位数,例如'001'
  • 计算光流:使用optical_flow_mg函数计算两帧图像间的光流。这里采用的是"FDRIG"模型,设置了运动估计的灵敏度、搜索半径、金字塔层数和窗口大小等参数,以及选择了精确的参数设置以提高计算准确性。
    * 计算光流
    optical_flow_mg (Image1, Image2, VectorField, 'fdrig', 0.8, 1, 8, 5, 'default_parameters', 'accurate')
        - Image1, Image2 是输入的前后两帧图像
        - VectorField 输出的光流向量场
        - 'fdrig' 光流模型选择,此处为固定点模型(Fixed-Dragged-Rigid)
        - 0.8 运动灵敏度因子,影响光流对运动的敏感程度
        - 1 搜索窗口半径,用于在周围寻找匹配点
        - 8 金字塔层级数,用于多尺度分析
        - 5 块大小,用于分块处理图像,增加计算效率
        - 'default_parameters' 使用默认参数配置
        - 'accurate' 使用更准确但计算成本更高的算法

  • 光流矢量场分割:通过对计算出的光流矢量场VectorField应用阈值处理,分割出显著的光流区域。这里假设任何非零的光流值都被认为是显著的。
    * 对光流向量场进行阈值处理以分割
    threshold (VectorField, Region, 1, 10000)
        - 保留大于等于1且小于等于10000的像素为前景(实际操作中通常不会设置如此大范围,此例或为示意)
  • 显示图像与结果:首先显示当前的图像帧,接着用黄色线条显示原始的光流矢量,然后用绿色宽线条高亮显示分割出的光流区域,以突出运动的对象区域。
 * 显示当前帧图像
    dev_display (Image2)

    * 以黄色细线显示光流向量
    dev_set_color ('yellow')
    dev_set_line_width (1)
    dev_display (VectorField)

    * 以绿色粗线显示分割后的光流区域
    dev_set_color ('green')
    dev_set_line_width (3)
    dev_display (Region)
  • 更新前一帧图像:将当前处理的图像复制给Image1,以便下一次迭代计算新的光流时作为参考帧。
  * 将当前帧图像赋给Image1,作为下一次循环计算光流的参考帧
    copy_obj (Image2, Image1, 1, 1)

此程序展示了如何分析视频序列中的动态信息,通过光流技术捕捉并可视化场景中物体的运动情况。光流的分割则帮助进一步突出了运动最剧烈或最显著的区域,这对于运动检测、跟踪以及许多计算机视觉任务都非常有用。


三、核心算子解释

optical_flow_mg 是一个用于计算光流(Optical Flow)的函数,常见于图像处理和计算机视觉库中,比如HALCON。光流是指在连续的视频帧或图像序列中,由于场景中物体的移动或相机本身的运动导致的像素强度变化所表现出的运动信息。它提供了从一帧到下一帧每个像素点的运动向量,是理解动态场景、跟踪对象、视频稳定等任务的重要基础。

原理简述

光流计算的基本原理基于亮度恒定假设和时间连续性假设,即在极短时间内,场景中一个点的亮度不会发生剧烈变化,且该点在相邻帧之间的运动是连续和平滑的。optical_flow_mg 实现了这一过程,通过比较两帧图像间像素强度的变化,结合局部运动模型和全局优化策略(如Lucas-Kanade方法或其变种),来估计每个像素的运动向量。在多尺度分析中,算法首先在较粗糙的图像尺度上快速估算光流,然后逐步细化到更精细的尺度,以获得更精确的结果。

函数原型及参数解释

optical_flow_mg(Image1, Image2, VectorField, Method, Alpha, DeltaR, Levels, BlockSize, 'default_parameters', Quality)

  • Image1: 第一帧图像,作为光流计算的参考帧。

  • Image2: 第二帧图像,与Image1相比发生了运动变化。

  • VectorField: 输出变量,存储计算得到的光流向量场。每个像素点上的向量表示从Image1到Image2该点的位移。

  • Method: 光流计算方法,这里使用的 'fdrig' 表示固定-拖拽-刚体(Fixed-Dragged-Rigid)模型。不同的方法对应不同的假设条件和计算策略,影响计算速度和精度。

  • Alpha: 运动灵敏度因子,控制光流对运动响应的敏感程度。较大的值意味着对运动更为敏感,但可能引入更多噪声;较小的值则相反。

  • DeltaR: 搜索窗口半径,指在当前像素周围寻找最佳匹配时的搜索范围大小。此值决定了光流估计的局部性。

  • Levels: 金字塔层级数。光流计算常采用图像金字塔方法来实现多尺度分析,提高计算效率和鲁棒性。层数越多,处理速度可能越快,但精度可能降低。

  • BlockSize: 分块大小,表示将图像分割成多个小块进行处理,以减少计算复杂度。较大的块可以减少计算量,但可能牺牲细节;反之亦然。

  • ‘default_parameters’: 使用算法的默认参数设置,这通常涉及内部优化和计算的具体配置。

  • Quality: 计算质量选项,这里使用的 'accurate' 意味着使用更精确的计算方法,尽管这可能增加计算时间。其他可能的选项如 'fast' 可能会牺牲一些精度以换取速度。

此函数通过调整不同参数,能够适应不同场景和需求下的光流计算,是视频分析、目标追踪等领域的常用工具。

效果呈现

在这里插入图片描述

总结

提示:这里对文章进行总结:

本文深入介绍了如何利用optical_flow_mg函数计算图像序列中的光流,并对计算出的光流进行分割,从而突出显示动态场景中的运动信息。通过一个详尽的示例程序,我们了解了从初始化显示环境、读取图像序列到循环处理每一对图像、计算光流、分割显著运动区域,以及最后显示这些运动信息的完整流程。

程序的核心在于optical_flow_mg函数的应用,它不仅要求对两帧连续图像进行精确的匹配以计算像素级的运动向量,还允许用户通过调整诸如运动模型、灵敏度因子、搜索窗口半径等参数来优化光流计算的效果。光流的分割进一步通过阈值处理区分出图像中重要的动态部分,这对于后续的运动分析、对象追踪等任务至关重要。

总结而言,本文不仅提供了光流计算的具体实践指南,还深入浅出地解析了关键算法原理和参数设置,为读者在视频处理、计算机视觉项目中应用光流技术奠定了坚实的基础。通过这样的技术,开发者能够更加精准地理解和分析视频内容,提升应用系统在动态场景理解方面的能力。

  • 37
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值