Halcon 使用光流算子检测运动物体

文章目录

  • 算子
    • optical_flow_mg 计算两个图像之间的光流
    • vector_field_length 计算向量场的向量长度
    • select_shape_std 选择给定形状的区域
    • vector_field_to_real 将矢量场图像转换为两个实值图像
    • intensity 计算灰度值的均值和偏差
    • local_max_sub_pix 以亚像素精度检测局部极大值
  • Halcon 光流算子示例
  • Halcon 获取移动物体的移动方向
  • Halcon 卫星图获取移动物体的移动方向

算子

optical_flow_mg 计算两个图像之间的光流

optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, IntegrationSigma, FlowSmoothness, GradientConstancy, MGParamName, MGParamValue : )
当使用光流计算函数时,以下是参数的解释:
    ImageT1:输入的第一幅图像。
    ImageT2:输入的第二幅图像。
    VectorField:计算得到的光流结果,会存储在这个变量中。
    Algorithm:用于计算光流的算法,可以选择 'clg', 'ddraw', 'fdrig' 中的一个。
    SmoothingSigma:初始高斯平滑的标准差。这个参数用于控制光流计算过程中的图像平滑程度。
    IntegrationSigma:积分滤波器的标准差。这个参数影响了光流场的积分过程。
    FlowSmoothness:平滑项相对于数据项的权重。它影响了光流场的平滑程度。
    GradientConstancy:梯度稳定性相对于灰度稳定性的权重。这个参数用于平衡梯度稳定性和灰度稳定性在光流计算中的影响。
    MGParamName:多网格算法的参数名称,可以指定不同的参数名来调整多网格算法的行为。
    MGParamValue:多网格算法的参数值,根据实际需求进行设置。

vector_field_length 计算向量场的向量长度

vector_field_length(VectorField : Length : Mode : )
以下是各个参数的解释:

    VectorField:输入的矢量场,包含了需要计算长度的向量。
    Length:计算得到的向量长度结果将会存储在这个变量中。
    Mode:用于计算向量长度的模式选择参数。
        'length':计算向量的长度。
        'squared_length':计算向量的平方长度。

select_shape_std 选择给定形状的区域

select_shape_std(Regions : SelectedRegions : Shape, Percent : )
以下是各个参数的解释:
    Regions:输入的区域,包含需要进行选择的区域。
    SelectedRegions:经过选择后具有所需形状的区域将会存储在这个变量中。
    Shape:要检查的形状特征参数。
        'max_area':检查最大面积。
        'rectangle1':检查矩形1'rectangle2':检查矩形2。
    Percent:相似性度量参数,用于确定区域形状的相似度。
        默认值:70.0
        推荐值范围:10.0, 30.0, 50.0, 60.0, 70.0, 80.0, 90.0, 95.0, 100.0
        典型取值范围:0.0 ≤ Percent ≤ 100.0
        最小增量:0.1
        推荐增量:10.0

vector_field_to_real 将矢量场图像转换为两个实值图像

vector_field_to_real(VectorField : Row, Col : : )
    VectorField (输入对象): 这个参数代表一个矢量场,通常描述图像中每个点处矢量的方向和大小。
    Row (输出对象): 表示沿着行方向的矢量分量,指示图像中沿着行的矢量场分量。
    Col (输出对象): 表示沿着列方向的矢量分量,指示图像中沿着列的矢量场分量。

intensity 计算灰度值的均值和偏差

intensity(Regions, Image : : : Mean, Deviation)
参数如下:
    Regions (输入对象): 计算特征的区域。
    Image (输入对象): 灰度值图像,用于计算特征。
    Mean (输出控制): 区域的平均灰度值。
    Deviation (输出控制): 区域内灰度值的偏差

local_max_sub_pix 以亚像素精度检测局部极大值

local_max_sub_pix(Image : : Filter, Sigma, Threshold : Row, Column)
参数说明如下:

    Image(输入对象):单通道图像,表示输入图像。
    Filter(输入控制):字符串,用于计算局部导数的方法。
        默认值:'facet'
        可选值:'facet''gauss'
    Sigma(输入控制):实数,高斯核的标准差。如果Filter为'facet',则Sigma可以设为0.0,以避免对输入图像进行平滑处理。
        建议值:0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
        约束:Sigma >= 0.0
    Threshold(输入控制):实数,Hessian矩阵特征值的绝对值最小值。
        默认值:5.0
        建议值:2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0
        约束:Threshold >= 0.0
    Row(输出控制):点y数组,检测到的极大值的行坐标。
    Column(输出控制):点x数组,检测到的极大值的列坐标。

Halcon 光流算子示例

在这里插入图片描述

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')
    * 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

在这里插入图片描述

Halcon 获取移动物体的移动方向

* 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
* 产生一个xld多边形区域
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')
    * 按照xld轮廓裁剪
    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)
        * 移动区域大于0
        if (Area > 0)
            * 形成一个外轮廓
            shape_trans (RegionMovement, ConvexHullregion, 'convex')
            * 外轮廓和ROI区域求交集
            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

在这里插入图片描述

Halcon 卫星图获取移动物体的移动方向

* This example demonstrates the use of the optical flow operators.
* By calculating the optical flow between two images, the
* position, speed, and movement direction of particles are calculated.
* 1. 读取图片
dev_update_off ()
dev_close_window ()
* 
read_image (Image1, 'hydraulic_engineering/hydraulic_engineering_01')
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
* 
dev_set_draw ('margin')
RCenter := -1
CCenter := -1
MeanR := 0
MeanC := 0
tanDir := 0
ArrowLength := 15
MinLength := 0.375
* 
for Index := 2 to 50 by 1
    read_image (Image2, 'hydraulic_engineering/hydraulic_engineering_' + Index$'02')
    * 2.估计移动粒子的区域
    * Calculate the optical flow between two images
    * 计算光流
    optical_flow_mg (Image1, Image2, VectorField, 'clg', 1, 1, 1000, 5, 'default_parameters', 'fast')
    * 计算向量场
    vector_field_length (VectorField, LengthImage, 'squared_length')
    * 
    * Estimate the region with moving particles using the length
    * of the vectors of the calculated vector field
    *
    * 计算灰度值
    min_max_gray (LengthImage, LengthImage, 0, Min, MaxLength, Range)
    if (MaxLength > MinLength)
        threshold (LengthImage, ROI, MinLength, MaxLength)
        * 
        * Find the position of particles in the original image using
        * an estimated ROI
        dilation_circle (ROI, RegionDilation, 3.5)
        reduce_domain (Image2, RegionDilation, ImageReduced)
        * 获取裁剪后图片的亚像素极大值点的行列坐标
        local_max_sub_pix (ImageReduced, 'facet', 1.0, 4, Row, Column)
        * 
        dev_set_color ('cyan')
        dev_set_line_width (2)
        if (|Row| > 0)
            * 产生区域点
            gen_region_points (Points, Row, Column)
            * 将点形成单独的连通域
            connection (Points, ConnectedRegions)
            * 将点膨胀
            dilation_circle (ConnectedRegions, PointsDilated, 2.5)
            * 
            * Display found particles and their movement directions
             * 3.获取移动方向
            count_obj (PointsDilated, NumberReg)
            dev_display (Image2)
            dev_display (PointsDilated)
            for J := 1 to NumberReg by 1
               
                select_obj (PointsDilated, SelectedRegions, J)
                * 
                * Estimate the speed of the particles
                reduce_domain (VectorField, SelectedRegions, ImageReducedVF)
                * 将矢量图转换为两个有方向的实值图像
                vector_field_to_real (ImageReducedVF, RowImage, ColumnImage)
                * 计算 行列坐标的平均灰度值和偏差
                intensity (ColumnImage, ColumnImage, MeanC, Deviation)
                intensity (RowImage, RowImage, MeanR, Deviation)
                Length := sqrt(MeanR * MeanR + MeanC * MeanC)
                * 绘制箭头
                gen_arrow_contour_xld (Arrow, Row[J - 1], Column[J - 1], Row[J - 1] + MeanR / Length * ArrowLength, Column[J - 1] + MeanC / Length * ArrowLength, 5, 10)
                dev_display (Arrow)
            endfor
        endif
    endif
    copy_obj (Image2, Image1, 1, 1)
endfor

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手撸nano-gpt

nano GPT 跟着youtube上AndrejKarpathy大佬复现一个简单GPT 1.数据集准备 很小的莎士比亚数据集 wget https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt 1.1简单的tokenize 数据和等下的模型较简单,所以这里用了个…

飞塔防火墙开局百篇——002.FortiGate上网配置——在路由模式下使用虚拟接口对(virtual-wire-pair)

在路由模式下使用虚拟接口对(virtual-wire-pair) 拓扑配置接口配置策略 使用方有透明模式下一进一出的这样需求的组网,可以在路由模式下使用虚拟接口对(virtual-wire-pair)替代。 登陆FortiGate防火墙界面,…

城市基础信息管理系统 (VB版电子地图源码/公交车线路图/超市平面图)-143-(代码+程序说明)

转载地址http://www.3q2008.com/soft/search.asp?keyword143 请访问 以下地址,查看最新版本, 新增加支持 建筑物 距离测量, 鸟瞰, 地图放大缩小, VB完善地图扩充程序(城市街道基础信息管理系统 )-362-(代码+) 这套系统印象深刻 因为,写了一…

12双体系Java学习之局部变量和作用域

局部变量 局部变量的作用域 参数变量

数据结构中的堆(Java)

文章目录 把普通数组转换大顶堆数组堆增删改查替换堆排序 把普通数组转换大顶堆数组 该方式适用索引为0起点的堆 在堆(Heap)这种数据结构中,节点被分为两类:叶子节点(Leaf Nodes)和非叶子节点(N…

面试旺季,鸿蒙开发岗位怎么能没有面试题刷呢?

一年一度的面试浪潮来袭,你是否也想着利用这次机会去实现,跳槽涨薪的梦呢?在往年这个时候基本就有许多的小伙伴跑找到我要相关的面试题进行刷题,或要简历模板对自己的简历进行优化。 今年我又整了点新鲜的面试题,如果…

Linux系统之ipcalc命令的基本使用

Linux系统之ipcalc命令的基本使用 一、ipcalc命令介绍二、ipcalc命令的使用帮助2.1 ipcalc命令的help帮助信息2.2 ipcalc命令的语法解释 三、ipcalc命令的基本使用3.1 计算子网掩码3.2 计算网络地址3.3 找出所对应的主机名3.4 计算子网详细信息 四、ipcalc命令使用注意事项 一、…

由于 Positive Technologies 的专业知识,Moxa 消除了工业无线转换器中的一个漏洞。

我们的专家在 NPort W2150A 和 W2250A 转换器中发现了该漏洞 - 这些设备可将工业控制器、仪表和传感器连接到本地 Wi-Fi 网络。Moxa 已根据负责任的披露政策通知了该威胁,并发布了软件更新。 🥷 攻击者可以完全访问这些设备。 Positive Technologies 公…

目标检测应用场景—数据集【NO.28】无人机红外目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

(二)运行自己的stable-diffusion

前面的步骤如https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b所示 拷贝、解压文件后,进入到stable-diffusion-webui的文件夹中,文件如下: 启动: 运行效果: 由于生成了好几个图,所以…

为什么不要使用elasticsearch

互联网上有很多文章,都在讲为什么要使用elasticsearch,却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年,负责公司万亿级别检索的操盘手,借着这篇文章,给大家分享一下,为什么不要使…

nginx swrr负载均衡算法的二宗罪及其改进的思考

目录 1. swrr负载均衡算法的二宗罪1.1 第一宗罪: 共振引起系统崩溃1.2 第二宗罪: 吃CPU大户 2. 对swrr负载均衡算法的改进的思考2.1 “共振”问题的解决2.2 “吃CPU大户”问题的解决 1. swrr负载均衡算法的二宗罪 swrr是一种基于加权轮询的负载均衡算法。它根据服务器的权重来分…

一款 Windows C盘文件清理工具

推荐一款 Windows C盘清理工具 0. 引言1. 下载地址 0. 引言 Windows 在使用过程,C盘的空间会变得越来越少。 Windows在C盘放了很多缓存,临时文件,我们自己还不敢乱删。 今天试了1款工具,可以很方便的查看C盘各个文件夹的文件大小…

中间件 | RabbitMq - [AMQP 模型]

INDEX 1 全局示意2 依赖 1 全局示意 AMQP,即高级消息队列协议(Advanced Message Queuing Protocol),整体架构如下图 producer 发送消息给 rabbit mq brokerrabbit mq broker 分发消息给 consumer消费producer/consumer 都通过 …

【Echarts】曲线图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

蝙蝠避障:我生活中的一道光

盲人的世界,是无尽的黑暗。看不见光,看不见色彩,甚至看不见自己的手。但在这个黑暗的世界里,我找到了一个光明的出口:一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

探索HDFS读写流程、节点机制和数据完整性

目录 写在前面一、HDFS的读写流程1.1 HDFS写数据流程1.2 机架感知1.3 HDFS读数据流程1.4 小结 二、 NameNode和SecondaryNameNode2.1 NN和2NN工作机制2.2 Fsimage和Edits解析2.2.1 oiv查看Fsimage文件2.2.2 oev查看Edits文件 2.3 CheckPoint时间设置 三、DataNode3.1 DataNode工…

Spring Cloud Alibaba微服务从入门到进阶(二)

Spring Boot配置管理 1、application.properties 2、application.yml 1.内容格式比较: .properties文件,通过 . 来连接,通过 来赋值,结构上,没有分层的感觉,但比较直接。 .yml文件,通过 &…

攻防演练|某车企攻防小记

前言 专注于web漏洞挖掘、内网渗透、免杀和代码审计,感谢各位师傅的关注!网安之路漫长,与君共勉! 实习期间针对某车企开展的一次攻防演练,过程很曲折,当时的记录没有了只是简单的总结一下。 攻击路径 收…

Promise图解,Pass

10-优化代码_哔哩哔哩_bilibili