halcon 2D模板匹配 3D

一、概述

模板匹配常用于定位和查找,有很多的方式,halcon 中就有灰度匹配 、形状匹配、变形匹配、缩放匹配等,其实最常用的还是两种第一个就是灰度匹配、还有就是形状匹配

二、金字塔概述

网上有很多关于金字塔的解释,我这里直接上图看看金字塔层数的不同影响

第一层:

第二层

第三层:

第四层:

 

第8层

从其中可以看出:

金字塔层数越高,模板图像越小所以金字塔越高,匹配越快

三、匹配

read_image (Image, './scale.tif')
gen_rectangle1 (ROI_0, 420.708, 55.4103, 2606.9, 1005.36)
area_center (ROI_0, Area2, Row3, Column3)
reduce_domain (Image, ROI_0, ImageReduced1)
crop_domain (ImageReduced1, ImagePart)
get_image_size (ImagePart, Width2, Height2)
create_shape_model (ImagePart, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 10, 5, ModelID)
get_shape_model_contours (ModelContours1, ModelID, 1)
vector_angle_to_rigid (0, 0, 0,Row3, Column3, 0, HomMat2D2)
dev_display (Image)
affine_trans_contour_xld (ModelContours1, ContoursAffineTrans1, HomMat2D2)

*Row2 找到匹配的全图的行
*Column2 找到匹配的全图的行
find_shape_model (Image, ModelID, -0.39, 0.79, 0.3, 1, 0.5, 'least_squares', 0, 0.9, Row2, Column2, Angle, Score)
* 模板是单个图像,所以这个起始位置和角度都是000
vector_angle_to_rigid (0, 0, 0, Row2, Column2, Angle, HomMat2D3)

dev_display (Image)
gen_cross_contour_xld (Cross1, Row2, Column2, 116, 0.78)
affine_trans_contour_xld (ModelContours1, ContoursAffineTrans, HomMat2D3)

这个是简单的使用,opencv 哪里要学习一些大概的实现 

补充一个paint_region算子: 将选中的区域变成自己想要的灰度值

* *把上面的图的7芯片   个变成白色
read_image(Image, 'printer_chip/printer_chip_01')
threshold (Image, Regions, 128, 255)
connection(Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 25360, 46760.5)
get_image_size (Image, Width, Height)
paint_region (SelectedRegions1, Image, imgR, 255, 'fill')

四、3D模板匹配

halcon 案例:

create_shape_model_3d_lowest_model_level.dev

 

* This example program shows how to use HALCON's shape-based
* 3D matching to find the 3D pose of tile spacers. Because
* the object appears large in the images, the 3D model
* needs many internal representations of different viewing
* angles. This leads to a very high memory consumption of
* the model. To reduce the needed memory, the parameter
* 'lowest_model_level' is used. By setting 'lowest_model_level'
* to a higher level (1 is the default) the memory consumption
* can be reduced approximately by factor 3 per level, while
* the time for the creation of the model is reduced by factor 2.
* In exchange, the robustness of the matching might decrease and
* the search time increases slightly (by 5-10%).
* 
* Here, 'lowest_model_level' is set to 3, which results in
* a reduction by factor 6 for the memory needed for the model
* and factor 4 for the time needed to create the model.
* 
dev_update_off ()
* 
* Set the camera parameters (can be obtained by calibrate_cameras)

* 相机的内参 焦距 相机畸变  x方向的像素当量 y方向的像素当量  图像坐标在平面坐标的 位置x y  图片的宽 图片的高
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)
* 从内参中获取 高和宽
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)
* 
read_image (Image, 'tile_spacers/tile_spacers_color_01')
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (3)
* 
* 
dev_clear_window ()
disp_message (WindowHandle, 'Reading the 3D shape model file from disk ...', 'window', 12, 12, 'black', 'false')
* Create the 3D shape model if it is not available on disk
try
    read_shape_model_3d ('tile_spacer.sm3', ShapeModel3DID)
catch (Exception)
    * 
    * 读取3D模型作为 目的是
    read_object_model_3d ('tile_spacer.dxf', 0.0001, [], [], ObjectModel3DID, DXFStatus)
    * 将3D模型投影到2D的图像坐标系中
    prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
    * 
    disp_message (WindowHandle, 'Reading the 3D shape model file from disk ... not found!', 'window', 12, 12, 'red', 'false')
    disp_message (WindowHandle, 'Creating the 3D shape model (may take a few seconds) ...', 'window', 42, 12, 'black', 'false')
    count_seconds (S1)
    * 
    * Model creation
    * 
    * Change the value of the 'lowest_model_level' parameter to
    * compare the training times and memory consumption on your
    * computer.
    * 用投影后的模组作为3D模板 其结果放到ShapeModel3DID 当中
    create_shape_model_3d (ObjectModel3DID, CamParam, 0, 0, 0, 'gba', -rad(60), rad(60), -rad(60), rad(60), 0, rad(360), 0.26, 0.27, 10, 'lowest_model_level', 3, ShapeModel3DID)
    count_seconds (S2)
    T := S2 - S1
    * 
    disp_message (WindowHandle, 'Creation time: ' + T$'.3' + ' s', 'window', 72, 12, 'black', 'false')
    try
        disp_message (WindowHandle, 'Writing model to disk ...', 'window', 102, 12, 'black', 'false')
        write_shape_model_3d (ShapeModel3DID, 'tile_spacer.sm3')
    catch (Exception)
        disp_message (WindowHandle, 'Writing model to disk ... failed!', 'window', 102, 12, 'red', 'false')
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endtry
endtry
disp_lowest_model_level_info (WindowHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Matching
Times := []
NumImages := 12
for I := 1 to NumImages by 1
    read_image (Image, 'tile_spacers/tile_spacers_color_' + I$'02')
    dev_display (Image)
    * 
    * Find up to three instances of the 3D shape model
    * (set 'border_model' to 'true' because the object may
    * touch the image border)
    count_seconds (Seconds1)
    find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.85, 0, ['num_matches','max_overlap','border_model'], [3,0.75,'true'], Pose, CovPose, Score)
    count_seconds (Seconds2)
    Time := Seconds2 - Seconds1
    Times := [Times,Time]
    * Visualize the found matches in the image by projecting
    * the 3D shape model into it using the pose of the match
    for J := 0 to |Score| - 1 by 1
        * Display contours
        PoseTmp := Pose[J * 7:J * 7 + 6]
        project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseTmp, 'true', rad(30))
        dev_set_color ('yellow')
        dev_display (ModelContours)
        * Display the coordinate system of the 3D object model
        dev_set_colored (3)
        disp_3d_coord_system (WindowHandle, CamParam, PoseTmp, 0.015)
    endfor
    for K := 0 to |Score| - 1 by 1
        * Display the parameters of the found pose
        PoseTmp := Pose[K * 7:K * 7 + 6]
        display_match_pose (ShapeModel3DID, PoseTmp, WindowHandle)
    endfor
    disp_message (WindowHandle, |Score| + ' Match(es) found in ' + Time$'4.2f' + ' s', 'window', 12, 12, 'dark green', ['white','false'])
    if (I < NumImages)
        disp_continue_message (WindowHandle, 'black', ['white','false'])
        stop ()
    endif
endfor
* 
disp_end_of_program_message (WindowHandle, 'black', ['white','false'])

 

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

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

相关文章

JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测

JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测 目录 JCR一区 | Matlab实现TTAO-CNN-BiLSTM-MATT多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现TTAO-CNN-BiLSTM-MATT三角拓扑聚合优化器优化双向长短期记忆神经网络融合多头注意力…

智慧园区能耗管控系统,3D可视化开发都需要哪些技术栈?

数据可视化&#xff1a; 数据可视化是将数据通过图表、图形、地图等可视化方式展示&#xff0c;使得数据更加直观、易于理解和分析。在智慧园区能耗管控系统中&#xff0c;可以使用各种图表库&#xff08;如Echarts、Highcharts&#xff09;和可视化工具&#xff08;如Tableau…

【LeetCode:2391. 收集垃圾的最少总时间 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【强化学习-深度强化学习DRL】什么问题可以用DRL解决?条件:场景固定数据廉价

引言&#xff1a;深度强化学习适用于满足场景固定、数据廉价这两个要求的问题求解。本节对场景固定进行详细的论述。术语&#xff1a;深度强化学习&#xff08;DRL&#xff09; 条件一&#xff1a;场景固定&#xff08;两个分布一致&#xff09; 场景固定指的是&#xff0c;保…

美股市场恒生指数冲刺19000点关口 地产股大涨

查查配5月10日电(中新财经记者 谢艺观)5月10日,港股现强势行情,恒生指数盘中一度冲至18993.28点,距离19000点关口仅一步之遥。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

HNCTF-PWN

1.ez_pwn 直接看危险函数&#xff0c;不能溢出&#xff0c;只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移&#xff0c;通过printf打印出ebp&#xff0c;通过偏移计算出栈地址。 通过gdb调试&#xff0c;偏移是0x38 以下是payload&#xff1a; from pwn import * #i…

通过单总线实现单片机之间的数据传输

单总线、没有时钟线的通信时&#xff0c;不能使用简单的高低电平来通信&#xff0c;因为接收方不知道此时发送的数据是第几位数据&#xff0c;容易造成错乱。 因此在使用一根线对外传输数据时&#xff0c;需要自定义一个通信协议&#xff0c;它至少要包含格式头数据&#xff0c…

二维数组 和 变长数组

在上一期的内容中&#xff0c;为诸君讲解到了一维数组&#xff0c;在一维数组的基础上&#xff0c;C语言中还有着多维数组&#xff0c;其中&#xff0c;比较典型且运用较为广泛的就是我们今天的主角——二维数组 一 . 二维数组的概念 我们把单个或者多个元素组成的数组定义为一…

springboot项目打包部署

springboot打包的前提条件jdk必须17以后不然本地运行不来&#xff08;我用的jdk是22&#xff09; 查看自己电脑jdk版本可以参考&#xff08;完美解决Windows10下-更换JDK环境变量后&#xff0c;在cmd下执行仍java -version然出现原来版本的JDK的问题-CSDN博客&#xff09; 1、…

uniapp音乐播放整理

一、前置知识点 1.1 音频组件控制-uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。 主要用于当前音乐播放&#xff1b; 1.1.1 innerAudioContext属性 属性类型说明只读平台差异说明srcString音频的数据链接&#xff0c;用于直接播放…

学浪app的课程怎么导出来

在这个知识如星辰般璀璨的时代&#xff0c;学浪app汇聚了无数智慧的火花&#xff0c;点亮了求知者的前行之路。你是否曾在学浪的海洋中遨游&#xff0c;汲取知识的甘露&#xff0c;却渴望将那些珍贵的课程内容&#xff0c;如同宝藏一般&#xff0c;从数字的海洋中提取出来&…

PY32F403系列单片机,32位M4内核MCU,主频最高144MHZ

PY32F403系列单片机是基于Arm Cortex-M4核的32位通用微控制器产品。内置的FPU和DSP功能支持浮点运算和全部DSP指令。通过平衡成本&#xff0c;性能&#xff0c;功耗来获得更好的用户体验。 PY32F403单片机典型工作频率可达144MHZ&#xff0c;内置高速存储器&#xff0c;丰富的…

Python-VBA函数之旅-str函数

目录 一、str函数的常见应用场景 二、str函数使用注意事项 三、如何用好str函数&#xff1f; 1、str函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、str函数的常…

【C -> Cpp】由C迈向Cpp (5)

标题&#xff1a;【C -> Cpp】由C迈向Cpp&#xff08;5&#xff09; 水墨不写bug &#xff08;图片来源于网络&#xff09; 不抵制失败&#xff0c;携手失败&#xff0c;迈向成功 正文开始&#xff1a; &#xff08;一&#xff09;深入理解构造函数 在之前的讲解中&#x…

安装Ununtu后常见问题(无法远程连接、root密码等)

安装Ununtu后常见问题&#xff08;无法远程连接、root密码、无法ifconfig等&#xff09; 提示&#xff1a;安装完Ununtu系统后会遇到一些常见的问题&#xff0c;本文一次洗解决 文章目录 安装Ununtu后常见问题&#xff08;无法远程连接、root密码、无法ifconfig等&#xff09;一…

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量&#xff0c;用于设置账号密码&#xff0c;我设置的账号和密码都是 minioadmin export MI…

PyQt5中的QtDesigner窗口

文章目录 1. 简介2. QtDesigner的MainWindow2.1 创建MainWindow2.2 添加组件2.3 预览2.4 查看对应的Python代码2.5 保存窗口并命名为login.ui&#xff0c;如下所示2.6对ui文件进行转换得到.py原件 3. 窗口常用属性及说明3.1 设置对象名称3.2 改变标题名字3.3 修改窗口大小 4. 更…

PyCharm 集成 Git

目录 1、配置 Git 忽略文件 2、定位Git 3、使用pycharm本地提交 3.1、初始化本地库 3.2、添加到暂存区 3.3、提交到本地库 3.4、切换版本 4、分支操作 4.1、创建分支 4.2、切换分支 4.3、合并分支 5、解决冲突 1、配置 Git 忽略文件 作用&#xff1a;与项目的实际…

conan2 基础入门(04)-指定编译器(gcc为例)

conan2 基础入门(04)-指定编译器(gcc为例) 文章目录 conan2 基础入门(04)-指定编译器(gcc为例)⭐准备生成profile文件预备文件和Code ⭐使用指令预览正确执行结果可能出现的问题 ⭐具体讲解conancmake ENDsettings.yml ⭐准备 生成profile文件 # 生成默认profile文件&#xf…

【userfaultfd+条件竞争劫持modprobe_path】TSGCTF 2021 -- lkgit

前言 入门题&#xff0c;单纯就是完成每日一道 kernel pwn 的 kpi &#x1f600; 题目分析 内核版本&#xff1a;v5.10.25&#xff0c;可以使用 userfaultfd&#xff0c;不存在 cg 隔离开启了 smap/smep/kaslr/kpti 保护开启了 SLAB_HADNERN/RANDOM 保护 题目给了源码&…