Halcon局部可变形模板匹配

文章目录

  • 算子
  • Halcon 使用局部变形算法案例

算子

create_local_deformable_model 创建局部可变形模板

prepare_direct_variation_model(RefImage, VarImage : : ModelID, AbsThreshold, VarThreshold : )
以下是参数的解释:
    RefImage (输入对象):对象的参考图像。这是一个单通道图像对象,用于表示对象的参考图像。
    VarImage (输入对象):对象的变异图像。这是一个单通道图像对象,用于表示对象的变异情况。
    ModelID (输入控制,状态被修改):变异模型的ID。用于指定要使用的变异模型的ID。
    AbsThreshold (输入控制):图像与变异模型之间差异的绝对最小阈值。默认值为10,建议的取值范围为05101520304050。限制条件为AbsThreshold >= 0VarThreshold (输入控制):基于变异模型变化的差异阈值。默认值为2,建议的取值范围为11.522.533.544.55。限制条件为VarThreshold >= 0

get_deformable_model_contours 返回可变形模型的轮廓表示形式

get_deformable_model_contours( : ModelContours : ModelID, Level : )
以下是参数的解释:
    ModelContours (输出对象):变形模型的轮廓表示。这是一个XLD(可扩展链表数据)数组对象,用于表示变形模型的轮廓。
    ModelID (输入控制):模型的句柄。用于指定要使用的变形模型的句柄。
    Level (输入控制):应返回轮廓表示的金字塔级别。默认值为1,建议的取值范围为12345678910。限制条件为Level >= 1

find_local_deformable_model 找到图像中局部可变形模型的最佳匹配

find_local_deformable_model(Image : ImageRectified, VectorField, DeformedContours : ModelID, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, NumLevels, Greediness, ResultType, GenParamName, GenParamValue : Score, Row, Column)
这是一个用于模型匹配的参数列表。以下是各个参数的说明:
    Image (input_object): 输入图像,在其中进行模型匹配。
    ImageRectified (output_object): 找到的模型的矫正后图像。
    VectorField (output_object): 矫正变换的向量场。
    DeformedContours (output_object): 找到的模型实例的轮廓。
    ModelID (input_control): 模型的句柄。
    AngleStart (input_control): 模型的最小旋转角度。
    AngleExtent (input_control): 旋转角度的范围。
    ScaleRMin (input_control): 模型在行方向上的最小尺度。
    ScaleRMax (input_control): 模型在行方向上的最大尺度。
    ScaleCMin (input_control): 模型在列方向上的最小尺度。
    ScaleCMax (input_control): 模型在列方向上的最大尺度。
    MinScore (input_control): 要找到的模型实例的最小得分。
    NumMatches (input_control): 要找到的模型实例的数量(或者设置为0以找到所有匹配)。
    MaxOverlap (input_control): 要找到的模型实例的最大重叠度。
    NumLevels (input_control): 匹配中使用的金字塔级别数。
    Greediness (input_control): 搜索启发式算法的“贪婪程度”。
    ResultType (input_control): 请求的图标结果类型。
    GenParamName, GenParamValue (input_control): 通用参数名称和值。
    Score, Row, Column (output_control): 找到的模型实例的得分、行坐标和列坐标。

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

vector_field_to_real(VectorField : Row, Col : : )
这些参数用于处理矢量场的相关操作。以下是各个参数的说明:
    VectorField (input_object): 输入的矢量场。
    Row (output_object): 行方向上的矢量分量图像。
    Col (output_object): 列方向上的矢量分量图像。

tuple_gen_const 生成特定长度的元组并初始化其元素

tuple_gen_const( : : Length, Const : Newtuple)
这些参数用于生成一个新的元组(tuple)。以下是各个参数的说明:
    Length (input_control): 要生成的元组的长度。
    Const (input_control): 用于初始化元组元素的常量值。
    Newtuple (output_control): 生成的新元组。

get_grayval_interpolated 返回图像在由行和列组成的元组给出的位置上的灰度值。

get_grayval_interpolated(Image : : Row, Column, Interpolation : Grayval)
这些参数用于获取图像特定位置的灰度值。以下是各个参数的说明:
    Image (input_object): 要访问灰度值的图像。
    Row (input_control): 指定位置的行坐标。
    Column (input_control): 指定位置的列坐标。
    Interpolation (input_control): 插值方法,用于确定非整数坐标位置的灰度值。
    Grayval (output_control): 选择的图像坐标的灰度值。

gen_region_points 将单个像素存储为图像区域

gen_region_points( : Region : Rows, Columns : )
这些参数用于创建一个特定区域(Region)。以下是各个参数的说明:
    Region (output_object): 创建的区域对象。
    Rows (input_control): 区域中像素所在的行坐标。
    Columns (input_control): 区域中像素所在的列坐标。

elliptic_axis 计算等效椭圆的参数

elliptic_axis(Regions : : : Ra, Rb, Phi)
这些参数用于描述输入的区域属性,并计算出与每个区域相关的主半径、次要半径和角度。以下是各个参数的说明:
    Regions (input_object): 输入的区域对象数组。
    Ra (output_control): 主半径,以区域面积为标准化单位。
    Rb (output_control): 次要半径,以区域面积为标准化单位。需满足Rb大于等于0且小于等于Ra。
    Phi (output_control): 主半径与x轴之间的夹角(弧度表示),需满足-π/2小于Phi并且Phi小于等于π/2

gen_region_contour_xld 从XLD轮廓创建一个区域

gen_region_contour_xld(Contour : Region : Mode : )
这些参数用于处理轮廓(contour)并创建相应的区域(region)。以下是各个参数的说明:

    Contour (input_object): 输入的轮廓对象数组。
    Region (output_object): 创建的区域对象数组。
    Mode (input_control): 区域的填充模式。
        'filled': 完全填充区域。
        'margin': 填充边缘。

gen_ellipse_contour_xld 创建一个对应于椭圆弧的XLD轮廓

gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )
这些参数用于创建椭圆轮廓(ellipse contour)。以下是各个参数的说明:
    ContEllipse (output_object): 创建的椭圆轮廓对象。
    Row (input_control): 椭圆中心的行坐标。
    Column (input_control): 椭圆中心的列坐标。
    Phi (input_control): 椭圆主轴的方向(弧度)。
    Radius1 (input_control): 椭圆长轴的长度。
        约束条件: Radius1大于0Radius2 (input_control): 椭圆短轴的长度。
        约束条件: Radius2大于等于0且小于等于Radius1。
    StartPhi (input_control): 沿椭圆边界的起始角度(弧度)。
    EndPhi (input_control): 沿椭圆边界的结束角度(弧度)。
    PointOrder (input_control): 沿边界的点顺序。
        可选值: 'negative'(逆时针), 'positive'(顺时针)。
    Resolution (input_control): 分辨率,相邻轮廓点之间的最大距离。
        约束条件: Resolution大于等于1.192e-7

清除句柄

clear_deformable_model (ModelID)
clear_variation_model (VariationModelID)

Halcon 使用局部变形算法案例

在这里插入图片描述

* This example program shows how to use local deformable
* matching to find and inspect objects that are deformed.
* 
* 1.读取图片
dev_update_off ()
Smoothness := 25
* 读取模板图片
read_image (ModelImage, 'gasket/gasket_model')
* 读取测试图片
read_image (Image, 'gasket/gasket_01')
dev_close_window ()
dev_open_window_fit_image (ModelImage, 0, 0, 500, -1, WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
get_window_extents (WindowHandle1, Row, Column, Width, Height)
dev_open_window_fit_image (Image, 0, Width + 12, 1024 - Width - 36, -1, WindowHandle2)
set_display_font (WindowHandle2, 16, 'mono', 'true', 'false')
* 
* Create variation model
* 2.创建图像比较的变化模型
* 使用索贝尔算子检测边缘(振幅)sobel_amp (ModelImage, EdgeAmplitude, 'thin_max_abs', 5)
* 创建图像比较变化模型
create_variation_model (425, 410, 'byte', 'direct', VariationModelID)
* 准备一个变化模型,以便与图像进行比较
prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 30, 1.5)
* 
* Create locally deformable model
* 3.创建局部可变形模板
create_local_deformable_model (ModelImage, 'auto', [], [], 'auto', 0.9, [], 'auto', 0.9, [], 'auto', 'none', 'use_polarity', 'auto', 'auto', [], [], ModelID)
* 返回可变形模型的轮廓表示形式
get_deformable_model_contours (ModelContours, ModelID, 1)
* 获取模型的行列坐标
area_center (ModelImage, Area, Row, Column)
* 仿射运算
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DTranslate)
* 显示
dev_set_window (WindowHandle1)
dev_set_line_width (2)
dev_set_color ('yellow')
dev_display (ModelImage)
dev_display (ContoursAffineTrans)
disp_message (WindowHandle1, 'Model image and contours', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
* 
* Process images iteratively 
* 4.找到图像中局部可变形模型的最佳匹配
NumImages := 9
for Index := 1 to NumImages by 1
    read_image (Image, 'gasket/gasket_' + Index$'02')
    dev_set_window (WindowHandle2)
    dev_display (Image)
    disp_message (WindowHandle2, 'Search ...', 'window', 12, 12, 'black', 'true')
    * Find the model in the search image.
    * As result, the rectified image, the respective
    * vector field, and the found contours are queried.
    count_seconds (S1)
    * 找到图像中局部可变形模型的最佳匹配
    find_local_deformable_model (Image, ImageRectified, VectorField, DeformedContours, ModelID, rad(-10), rad(20), 1, 1, 1, 1, 0.93, 1, 0.7, 0, 0.4, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [Smoothness,0,1], Score, Row, Column)
    count_seconds (S2)
    Time := S2 - S1
    if (|Score| > 0)
        * 产生网格
        gen_warped_mesh_region (VectorField, MeshRegion, Smoothness)
        *从XLD轮廓创建一个区域
        gen_region_contour_xld (DeformedContours, EdgeRegion, 'margin')
        * 轮廓进行膨胀
        dilation_circle (EdgeRegion, RegionDilation, 2 * Smoothness)
        * 计算区域的交集,和网格的交集
        intersection (RegionDilation, MeshRegion, RegionIntersection)
        dev_set_line_width (1)
        dev_set_color ('yellow')
        dev_display (RegionIntersection)
        Found[Index] := |Score|
        dev_set_line_width (2)
        dev_set_color ('green')
        dev_display (DeformedContours)
        disp_message (WindowHandle2, ['Match found in ' + Time$'1.2f' + ' s','Score: ' + Score$'.2f'], 'window', 12, 12, 'black', 'true')
        dev_set_window (WindowHandle1)
        dev_display (ImageRectified)
        * 比较两个区域的不同
        compare_variation_model (ImageRectified, Region, VariationModelID)
        * 形成单个连通域
        connection (Region, ConnectedRegions)
        * 筛选区域面积
        select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 40, 99999)
        count_obj (SelectedRegions, Number)
        if (Number > 0)
            area_center (SelectedRegions, Area, Row1, Column1)
            * 计算等效的椭圆参数
            elliptic_axis (SelectedRegions, Ra, Rb, Phi)
            tuple_gen_const (Number, 1, Ones)
            PointOrder := []
            for Idx := 0 to Number - 1 by 1
                PointOrder := [PointOrder,'positive']
            endfor
            * 产生椭圆亚像素轮廓
            gen_ellipse_contour_xld (ContEllipse, Row1, Column1, Phi, Ra + 10, Rb + 10, 0 * Ones, 6.28318 * Ones, PointOrder, 1.5)
            dev_set_color ('red')
            dev_display (ContEllipse)
            disp_message (WindowHandle1, 'Part not OK!', 'window', 12, 12, 'red', 'true')
        else
            disp_message (WindowHandle1, 'Part OK', 'window', 12, 12, 'forest green', 'true')
        endif
    else
        disp_message (WindowHandle2, 'Nothing found', 'window', 12, 12, 'black', 'true')
    endif
    if (Index < NumImages)
        disp_continue_message (WindowHandle2, 'black', 'true')
        stop ()
    endif
endfor
* 
* Clean up
clear_deformable_model (ModelID)
clear_variation_model (VariationModelID)

在这里插入图片描述

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

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

相关文章

Web核心

JavaWeb技术栈 B/S架构&#xff1a;Browser/Server &#xff0c; 浏览器/服务器 架构模式&#xff0c;其特点为&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…

python编程从入门到实践

python编程从入门到实践 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff1a;9. 处…

专业140+总430+电子科技大学858信号与系统考研经验成电电子信息与通信工程,电科大,真题,大纲,参考书。

今年考研成绩出来&#xff0c;初试专业课858信号与系统140&#xff0c;总分430&#xff0c;其余各门分数都比较平稳&#xff0c;总分好于自己估分&#xff0c;应群里很多同学要求&#xff0c;我总结一下自己的复习经验。首先我是一个大冤种&#xff0c;专业课资料学长给了一套&…

2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(每题 2 分,共 30 分) 第1题 假设变量 x 为 float 类型,如果下面代码输入为 100,输出最接近( )。 A.0 B.-5 C.-8 D.8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中…

2022年 NOC大赛 Python编程 创客智慧编程赛项【初赛】 竞赛真题

第1题:【 单选题】 运行以下代码,终端区会出现什么内容? A:9 B:0 C:25 D:终端区会报错 【正确答案】: C 【试题解析】 :count 函数中有一个参数 a,运行函数时,函数会遍历传入的列表,并且将其中的元素装进变量i中,累加进 result 变量里在最后一行代码中,将 num_li…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 条件渲染前言&#xff1a;v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言&#xff1a; 在JavaScript中&#xff0c;我们知道条件控制语句可以控制程序的走向&#…

女子焦虑躯体化3年,感觉生活非常痛苦!

焦虑的躯体化是一种心理问题显现为身体症状的情况&#xff0c;常见于长期面临心理压力和情绪困扰的人群。在日常生活中&#xff0c;女性更容易出现焦虑的躯体化现象&#xff0c;她们可能因为职场竞争、家庭压力、人际关系等原因产生焦虑情绪&#xff0c;这些焦虑情绪在身体上表…

TQTT X310 软件无线电设备的FLASH固件更新方法--WIN和UBUNTU环境

TQTT X310 除了PCIE口全部兼容USRP 官方的X310&#xff0c;并配备两块UBX160射频子板以及GPSDO。TQTT X310可以直接使用官方的固件&#xff0c;但是不支持官方的固件升级命令。这篇BLOG提供烧写刷新FLASH的方法。 这里分别给出WIN下和UBUNTU下升级的软件和方法 WIN环境下烧写…

ChatGPT 提问没反应了,怎么办?4种方法!试试看

用了将近 1 年的 ChatGPT 昨天下午提问忽然之间没反应了&#xff0c;有点失落&#xff0c;我原本以为是账号到期了呢。 之后&#xff0c;尝试用谷歌邮箱注册登录也不行。 打开调试一看&#xff0c;接口状态 403 &#xff0c;没有权限了&#xff0c;logout。 怎么办呢&#xf…

C# OpenCvSharp DNN FreeYOLO 人脸检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 人脸检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…

3.7号freeRtoS

1. 串口通信 配置串口为异步通信 设置波特率&#xff0c;数据位&#xff0c;校验位&#xff0c;停止位&#xff0c;数据的方向 同步通信 在同步通信中&#xff0c;数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持…

深入了解JavaScript:声明式与命令式编程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

保姆级讲解 Stable Diffusion

目录 本文讲解思路介绍 一、引入 二、Diffusion Model 三、原文的摘要和简介 四、Stable Diffusion 4.1、组成模块 4.2、感知压缩 4.3、条件控制 五、图解 Stable Diffusion 5.1、潜在空间的扩散 5.2、条件控制 5.3、采样 5.4、Diffusion Model 与 Stable Diffusion …

基于Spring Boot+ Vue的房屋租赁系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

YOLOv8优化策略:SPPF涨点篇 |引入YOLOv9的SPPELAN

🚀🚀🚀本文改进:SPP创新结合ELAN,来自于YOLOv9,助力YOLOv8,将SPPELAN代替原始的SPPF 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.YOLOv9介绍 论文: 2402.13616.pdf (arxiv.org) 摘要: 如今…

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件 cl /nologo /X /II:/code/reactos-master/sdk/include/asm /II:/code/reactos-master/output-VS-amd64-sln/sdk/include/asm -II:/code/reactos-master/sdk/include -II:/code/reactos-master/sdk/include…

使用docker部署redis集群

编写脚本 批量创建目录文件&#xff0c;编写配置文件 [rootlocalhost ~]# cat redis.sh #/bin/bash for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >>/mydata/redis/node-…

JVM 的垃圾回收机制以及垃圾回收算法的详解

目录 1、JVM 的垃圾回收机制 2、识别垃圾 2.1、引用计数 2.2、可达性分析 3、垃圾回收算法 3.1、标记-清除 3.2、复制算法 3.3、标记-整理 4、分代回收 1、JVM 的垃圾回收机制 对于&#xfeff;程序计数器&#xfeff;、&#xfeff;虚拟机栈&#xfeff;、&#xfe…

FairScale 库测试实验(一)-- 大模型训练基础之模型并行

DDP的分布式训练方法采用数据并行方式&#xff0c;相当于通过增大数据的batch来加快训练。但对于大模型&#xff08;LLM&#xff09;来说&#xff0c;DDP已经不适用了。因为LLMs的模型本身太大&#xff0c;一块GPU都放不下怎么可能去复制从而实现数据并行呢。所以LLM的训练采用…

MySQL--优化(索引--索引失效场景)

MySQL–优化&#xff08;索引–索引失效场景&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 常见的索引失效场景 1、场景准备&#xff1a; 给 tb_user 表创建联合索引&#xff0c;字段为&#xff1…