HDevelop示例程序-optical_flow_bicycle.hdev

应用范围: 安全系统

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

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

提示:文章目录


前言

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

这段代码是一个使用HALCON(一种机器视觉库)编写的示例程序,旨在通过光流法(Optical Flow)来检测图像序列中的移动物体,并在检测到移动物体时自动开启一个假设的出口门。


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

一、原示例程序

代码如下(示例):

* This example demonstrates the use of the optical flow for
* the detection of moving objects in an image sequence.
* The region of interest is analyzed to detect moving objects.
* If a moving object is detected, the exit gate is opened automatically.
* 
* Initialize output window
dev_update_off ()
read_image (Image1, 'bicycle/bicycle_01')
ZoomFactor := 0.5
zoom_image_factor (Image1, Image1, ZoomFactor, ZoomFactor, 'constant')
dev_close_window ()
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
* 
* Generate ROI
gen_contour_polygon_xld (ROI, [0,0,283,348,479,479] * ZoomFactor, [0,379,379,434,639,0] * ZoomFactor)
gen_region_contour_xld (ROI, RegionROI, 'filled')
reduce_domain (Image1, RegionROI, Image1ROI)
* 
* Main loop: Calculate optical flow and display moving area
* 
for I := 2 to 27 by 1
    read_image (Image2, 'bicycle/bicycle_' + I$'.2')
    * 
    * Zoom images to speed-up calculation of optical flow
    zoom_image_factor (Image2, Image2, ZoomFactor, ZoomFactor, 'constant')
    reduce_domain (Image2, RegionROI, Image2ROI)
    * 
    optical_flow_mg (Image1ROI, Image2ROI, VectorField, 'fdrig', 0.8, 1, 10, 5, ['default_parameters','warp_zoom_factor'], ['fast',0.8])
    vector_field_length (VectorField, LengthImage, 'squared_length')
    * 
    * Segment regions with moving objects in the defined ROI
    min_max_gray (RegionROI, LengthImage, 0.1, Min, Max, Range)
    dev_display (Image2)
    if (Max > 2)
        threshold (LengthImage, RegionMovement, 2, Max)
        connection (RegionMovement, ConnectedRegions)
        * Select largest moving region
        select_shape_std (ConnectedRegions, RegionMovement, 'max_area', 70)
        area_center (RegionMovement, Area, RCenterNew, CCenterNew)
        if (Area > 0)
            shape_trans (RegionMovement, ConvexHullregion, 'convex')
            intersection (RegionROI, ConvexHullregion, RegionMovementInROI)
            reduce_domain (VectorField, ConvexHullregion, VectorReduced)
            vector_field_to_real (VectorReduced, Row, Column)
            * 
            * Estimate the movement direction and the speed
            intensity (RegionMovementInROI, Row, MeanRow, Deviation)
            intensity (RegionMovementInROI, Column, MeanColumn, Deviation1)
            * 
            * Display results
            dev_set_line_width (1)
            dev_set_color ('yellow')
            dev_display (VectorReduced)
            * Display region of interest
            dev_set_line_width (3)
            dev_set_color ('magenta')
            dev_display (RegionROI)
            * Display region of moving object in the region of interest
            dev_set_color ('green')
            dev_display (RegionMovementInROI)
            gen_arrow_contour_xld (Arrow, RCenterNew, CCenterNew, RCenterNew + MeanRow, CCenterNew + MeanColumn, 10, 10)
            dev_display (Arrow)
        endif
    endif
    * 
    copy_obj (Image2ROI, Image1ROI, 1, 1)
endfor

二、程序解释

下面是逐行的详细解释:

  1. 初始化输出窗口

    dev_update_off () 
    

    禁止图形用户界面的更新,提高处理速度。

  2. 读取初始图像并缩放

    read_image (Image1, 'bicycle/bicycle_01')
    ZoomFactor := 0.5
    zoom_image_factor (Image1, Image1, ZoomFactor, ZoomFactor, 'constant')
    

    从文件路径读取第一帧图像(这里以自行车为例),然后设置一个缩放因子(这里是0.5),对图像进行等比例缩小,以便加速后续的光流计算过程。

  3. 关闭和重新调整窗口适应图像大小

    dev_close_window ()
    dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
    dev_set_draw ('margin')
    

    关闭当前窗口,然后根据缩放后的Image1大小打开一个新的窗口,并设置绘制模式为显示边缘。

  4. 生成感兴趣区域(ROI)

    gen_contour_polygon_xld (ROI, [0,0,283,348,479,479] * ZoomFactor, [0,379,379,434,639,0] * ZoomFactor)
    gen_region_contour_xld (ROI, RegionROI, 'filled')
    reduce_domain (Image1, RegionROI, Image1ROI)
    

    通过给定的多边形坐标定义一个ROI,用于后续分析。这些坐标被缩放后,生成一个XLD(高级图元描述)轮廓,然后将其转换为填充的区域RegionROI。最后,限制Image1的操作范围在该区域内,得到Image1ROI

  5. 主循环处理图像序列

    for I := 2 to 27 by 1
        ...
    endfor
    

    循环读取第2张至第27张图像,进行相似处理。

  6. 读取并缩放下一帧图像

    read_image (Image2, 'bicycle/bicycle_' + I$'.2')
    zoom_image_factor (Image2, Image2, ZoomFactor, ZoomFactor, 'constant')
    reduce_domain (Image2, RegionROI, Image2ROI)
    

    读取下一张图像,同样进行缩放,并限定操作范围于ROI内。

  7. 计算光流

    optical_flow_mg (Image1ROI, Image2ROI, VectorField, 'fdrig', 0.8, 1, 10, 5, ['default_parameters','warp_zoom_factor'], ['fast',0.8])
    

    使用optical_flow_mg函数计算两帧图像间的光流场。参数包括:

    • 'fdrig':使用固定比例的鲁棒性估计器。
    • 0.8:光流平滑参数。
    • 1:迭代次数。
    • 10:金字塔层数。
    • 5:最小图像尺寸。
    • ['default_parameters','warp_zoom_factor']:其他参数设定为默认,但允许使用自适应缩放以加快计算。
    • ['fast',0.8]:快速模式和相应的缩放系数。
  8. 计算向量场长度

    vector_field_length (VectorField, LengthImage, 'squared_length')
    

    计算光流向量场的长度(这里采用平方长度),得到LengthImage

  9. 检测移动区域
    接下来的代码段涉及阈值处理、连通域分析等,目的是识别出移动区域。通过比较移动区域的大小和位置,可以判断是否有移动物体进入ROI,并计算其运动方向和速度。

  10. 更新图像

    copy_obj (Image2ROI, Image1ROI, 1, 1)
    

    将当前帧的ROI数据复制到前一帧的对应ROI中,准备下一次循环的光流计算。

整个程序通过光流分析来检测连续图像序列中是否有物体在ROI内移动,如果检测到显著的移动,则通过一系列图像处理步骤定位并突出显示移动物体,以及估计其运动特性。这种技术常用于视频监控、自动驾驶车辆的障碍物检测等领域。


三、核心算子解释

gen_contour_polygon_xld

功能:这个算子用于根据给定的顶点坐标生成一个XLD(高级图元描述)多边形轮廓。XLD是一种用于描述形状的高级数据类型,在HALCON中广泛用于形状分析和几何处理。

原理解释:此函数基于提供的顶点坐标列表,按照顺序连接这些点形成一个闭合的多边形轮廓。每个坐标对 [x, y] 定义了多边形的一个顶点。在实际应用中,这些坐标会用来构建一个区域,比如定义感兴趣的区域(ROI)。

参数解释:

  • ROI: 输出变量,用于存储生成的XLD轮廓。
  • Row, Column: 分别为多边形顶点的行坐标和列坐标的数组。在这段代码中,使用了两个数组,一个代表行坐标,另一个代表列坐标,且都是经过缩放因子ZoomFactor调整过的。例如,原始顶点坐标为(0, 0), (283, 379), (479, 434), (479, 639), (283, 379),经过缩放后用于适应不同大小的图像处理需求。

gen_region_contour_xld

功能:这个算子用于将一个XLD轮廓转换为一个区域(Region)。区域是HALCON中另一种重要的数据类型,它能更好地描述图像中的连通像素集,适用于各种基于区域的操作,如裁剪、分析等。

原理解释:此函数基于输入的XLD轮廓,计算其内部所有像素,生成一个填充的区域。这意味着区域内的每一个像素都被认为属于该轮廓所描述的形状内部。

参数解释:

  • ROI: 输入变量,即上一步生成的XLD轮廓。
  • RegionROI: 输出变量,用于存储生成的区域。
  • ‘filled’: 参数指定了如何生成区域,这里是填充内部,意味着多边形轮廓内的所有像素都会被标记为区域的一部分。

reduce_domain

功能:这个算子用于限制图像或区域的操作范围,只在指定的区域内进行处理。这在处理大图像或只关心图像特定部分时非常有用,可以减少计算量,提高效率。

原理解释:它通过创建原图像或区域的一个副本,并仅保留与指定区域重叠的部分。在这个例子中,Image1的所有处理仅在RegionROI定义的范围内进行。

参数解释:

  • Image1: 输入图像,原始图像数据。
  • RegionROI: 限制操作范围的区域。在这个上下文中,就是之前由多边形转换而来的填充区域。
  • Image1ROI: 输出图像,即在RegionROI限制下的Image1副本。后续的图像处理步骤将只针对这个裁剪后的图像进行。

效果图

在这里插入图片描述

总结

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

本文全面解析了一个使用HALCON机器视觉库编写的程序实例,该程序展示了如何实现光流法来监测图像序列中的运动物体,并响应于检测到的移动自动激活安全门模拟开启过程。通过详细的代码解说,文章逐行剖析了程序的主要步骤,从初始化环境、图像预处理、ROI生成到光流计算、移动物体检测,以及最终的运动特征评估与结果显示。

程序首先通过dev_update_off提升了计算性能,接着利用read_imagezoom_image_factor读取并缩放图像,确保高效处理。通过dev_open_window_fit_imagedev_set_draw设置了合适的显示环境。关键的ROI生成步骤利用gen_contour_polygon_xldgen_region_contour_xld创建并填充了感兴趣区域,为后续的精确分析奠定基础。

在主循环中,程序逐一处理图像序列,利用optical_flow_mg算子计算光流,揭示物体运动信息,并通过vector_field_length将光流场转换为易于分析的长度图像。通过对长度图像的阈值处理、连通域分析等,程序有效识别并标出了移动区域,进一步计算移动物体的中心、方向和速度,最终通过图形界面实时显示分析结果,包括运动矢量、ROI边界以及移动物体的绿色轮廓,同时通过箭头指示物体移动方向。

文章还深入讲解了核心算子如gen_contour_polygon_xldgen_region_contour_xldreduce_domain的工作原理及其在程序中的具体应用,加深了对HALCON图像处理技术的理解。附带的图片示例直观展现了程序运行效果,增强了说明的直观性。

总结而言,本文不仅提供了光流法应用于运动检测的实践指南,也是一份关于HALCON图像处理技巧和算子使用的深度教程,对于从事机器视觉项目开发、安防监控系统设计等领域的人来说,具有较高的参考价值和实践意义。

HDevelop中使用`gen_measure_rectangle2`函数实现矩形测量,可以按照以下步骤进行: 1. 打开HDevelop开发环境,创建一个新的程序。 2. 读取图像并显示: ```HDevelop read_image(Image, 'test.jpg') dev_set_window ('fit') dev_display(Image) ``` 3. 创建矩形测量区域: ```HDevelop create_measure_rectangle2(Row, Column, Phi, Length1, Length2, ImageWidth, ImageHeight, &MeasureHandle) dev_display(MeasureHandle) ``` 其中,`Row`和`Column`表示矩形中心点的行列坐标,`Phi`表示矩形相对于X轴的旋转角度,`Length1`和`Length2`分别表示矩形的长和宽,`ImageWidth`和`ImageHeight`分别表示图像的宽和高,`MeasureHandle`表示测量区域的句柄。 4. 定义测量参数: ```HDevelop MeasureThreshold := 20 MeasureTransition := 'positive' MeasureSelect := 'all' MeasureInterpolation := 'bicubic' MeasureSigma := 1.0 MeasureAngle := 'use_polarity' MeasureSubPixel := 'no_refinement' MeasureRoi := 'no_pregeneration' ``` 5. 执行矩形测量: ```HDevelop gen_measure_rectangle2(MeasureHandle, Image, 'first', 'last', 1, MeasureTransition, MeasureSelect, MeasureThreshold, MeasureRoi, MeasureAngle, MeasureSubPixel, &ResultRow, &ResultColumn, &ResultPhi, &ResultLength1, &ResultLength2) ``` 其中,`Image`表示输入图像,`ResultRow`、`ResultColumn`、`ResultPhi`、`ResultLength1`和`ResultLength2`分别表示测量结果中矩形中心点的行列坐标、旋转角度、长和宽。 6. 输出测量结果: ```HDevelop disp_message(WindowHandle, 'Row: '+ResultRow.ToString(), 'window', 12, 12, 'black', 'true') disp_message(WindowHandle, 'Column: '+ResultColumn.ToString(), 'window', 24, 12, 'black', 'true') disp_message(WindowHandle, 'Phi: '+ResultPhi.ToString(), 'window', 36, 12, 'black', 'true') disp_message(WindowHandle, 'Length1: '+ResultLength1.ToString(), 'window', 48, 12, 'black', 'true') disp_message(WindowHandle, 'Length2: '+ResultLength2.ToString(), 'window', 60, 12, 'black', 'true') ``` 其中,`WindowHandle`表示显示结果的窗口句柄。 完整代码如下: ```HDevelop read_image(Image, 'test.jpg') dev_set_window ('fit') dev_display(Image) create_measure_rectangle2(Row, Column, Phi, Length1, Length2, ImageWidth, ImageHeight, &MeasureHandle) dev_display(MeasureHandle) MeasureThreshold := 20 MeasureTransition := 'positive' MeasureSelect := 'all' MeasureInterpolation := 'bicubic' MeasureSigma := 1.0 MeasureAngle := 'use_polarity' MeasureSubPixel := 'no_refinement' MeasureRoi := 'no_pregeneration' gen_measure_rectangle2(MeasureHandle, Image, 'first', 'last', 1, MeasureTransition, MeasureSelect, MeasureThreshold, MeasureRoi, MeasureAngle, MeasureSubPixel, &ResultRow, &ResultColumn, &ResultPhi, &ResultLength1, &ResultLength2) disp_message(WindowHandle, 'Row: '+ResultRow.ToString(), 'window', 12, 12, 'black', 'true') disp_message(WindowHandle, 'Column: '+ResultColumn.ToString(), 'window', 24, 12, 'black', 'true') disp_message(WindowHandle, 'Phi: '+ResultPhi.ToString(), 'window', 36, 12, 'black', 'true') disp_message(WindowHandle, 'Length1: '+ResultLength1.ToString(), 'window', 48, 12, 'black', 'true') disp_message(WindowHandle, 'Length2: '+ResultLength2.ToString(), 'window', 60, 12, 'black', 'true') ``` 需要注意的是,本示例代码仅供参考,实际使用时需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值