halcon三维点云数据处理(七)find_shape_model_3d_recompute_score
目录
- 一、find_shape_model_3d_recompute_score例程代码
- 二、set_object_model_3d_attrib_mod函数
- 三、prepare_object_model_3d 函数
- 四、create_cube_shape_model_3d函数
- 五、获得CamPose
- 六、project_cube_image函数
- 七、find_shape_model_3d函数
- 八、project_shape_model_3d函数
一、find_shape_model_3d_recompute_score例程代码
gen_cam_par_area_scan_division (0.01, 0, 7e-6, 7e-6, 320, 240, 640, 480, CamParam)
get_cam_par_data (CamParam, 'image_width', Width)
get_cam_par_data (CamParam, 'image_height', Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_update_off ()
*
* Generate a cube
X := [-1, -1, 1, 1, -1, -1, 1, 1]
Y := [1, -1, -1, 1, 1, -1, -1, 1]
Z := [-1, -1, -1, -1, 1, 1, 1, 1]
Polygons := [4, 0, 1, 2, 3, 4, 4, 5, 6, 7, 4, 0, 1, 5, 4, 4, 3, 2, 6, 7, 4, 0, 3, 7, 4, 4, 1, 2, 6, 5]
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3DID)
set_object_model_3d_attrib_mod (ObjectModel3DID, 'polygons', [], Polygons)
*
* Prepare the 3D object model for matching
prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
*
* Display the 3D object model
disp_object_model_3d_safe (WindowHandle, ObjectModel3DID, CamParam, [0, 0, 11, 30, 40, 0, 0], [], [])
disp_message (WindowHandle, '3D Object Model of a Cube', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
*
* Generate the 3D shape model
create_cube_shape_model_3d (WindowHandle, ObjectModel3DID, CamParam, ShapeModel3DID)
*
Scores1 := []
Scores2 := []
Times1 := []
Times2 := []
Longitudes := []
Latitude := rad(45)
Distance := 11.5
dev_set_color ('green')
dev_set_line_width (2)
for Longitude := rad(30) to rad(60) by rad(0.25)convert_point_3d_spher_to_cart (Longitude, Latitude, Distance, '-y', '-z', CamX, CamY, CamZ)create_cam_pose_look_at_point (CamX, CamY, CamZ, 0, 0, 0, '-y', 0, CamPose)* Prevent flickeringset_system ('flush_graphic', 'false')* * Generate an artificial image of the cubeproject_cube_image (Image, CamPose, CamParam, X, Y, Z, Polygons)* * Find the cube by using 3D shape-based matching* ('recompute_score' = 'false')count_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, [], [], Pose1, CovPose1, Score1)count_seconds (Seconds2)Time1 := (Seconds2 - Seconds1) * 1000.0* Find the cube by using 3D shape-based matching* ('recompute_score' = 'true')count_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, 'recompute_score', 'true', Pose2, CovPose2, Score2)count_seconds (Seconds2)Time2 := (Seconds2 - Seconds1) * 1000.0* * Display the matching resultdev_display (Image)if (|Score1| == 1 and |Score2| == 1)* Display the matchproject_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, Pose1, 'true', rad(30))dev_display (ModelContours)* Display the matching time and scoredisp_message (WindowHandle, 'Matching at Longitude: ' + deg(Longitude)$'3.1f' + ' deg (from 30 to 60 deg)', 'window', 12, 12, 'white', 'false')gen_matching_result_message (Time1, Time2, Score1, Score2, Message)disp_message (WindowHandle, Message, 'window', 420, 12, ['white', 'yellow', 'green'], 'false')* Remember the score valuesLongitudes := [Longitudes,deg(Longitude)]Scores1 := [Scores1,Score1]Scores2 := [Scores2,Score2]Times1 := [Times1,Time1]Times2 := [Times2,Time2]endif* Prevent flickeringset_system ('flush_graphic', 'true')* Show what we painted in the loop by drawing a invisible linedisp_line (WindowHandle, -1, -1, -1, -1)
endfor
*
* Display the score values
dev_clear_window ()
Title := ['\'recompute_score\'=\'false\'', '\'recompute_score\'=\'true\'']
Colors := ['yellow', 'green']
plot_tuple (WindowHandle, Longitudes, [Scores1,Scores2], 'Longitude [deg]', 'Matching score', Colors, ['ticks_x', 'ticks_y', 'end_y'], [6, .01, 1])
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
plot_tuple (WindowHandle, Longitudes, [Times1,Times2], 'Longitude [deg]', 'Matching time [ms]', Colors, 'ticks_x', 6)
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')
二、set_object_model_3d_attrib_mod函数
set_object_model_3d_attrib_mod( : : ObjectModel3D, AttribName, AttachExtAttribTo, AttribValues : )
set_object_model_3d_attrib_mod 函数将给定的 AttribName 中的标准属性或扩展属性设置为 AttribValues 中的值。set_object_model_3d_attrib_mod 与 set_object_model_3d_attrib 函数相同,不同之处在于它不会创建新的 3D 对象模型,而是修改给定的对象模型。通过设置参数 AttachExtAttribTo,可以将扩展属性的值附加到 3D 对象模型已有的标准属性上。对于标准属性,AttachExtAttribTo 参数将被忽略。
如果在 AttribName 中的属性不存在,则在可能的情况下创建它们。如果已存在的属性被设置,那么 AttribValues 的长度必须与现有的属性值长度相匹配。在这种情况下,现有的属性值将被替换。如果使用 AttachExtAttribTo 将扩展属性附加到已存在的标准属性上,那么 AttribValues 的长度必须与现有的属性值长度相匹配
‘polygons’:
上面的程序中设置的’polygons’,我个人认为是很难理解的。
Polygons := [4, 0, 1, 2, 3, 4, 4, 5, 6, 7, 4, 0, 1, 5, 4, 4, 3, 2, 6, 7, 4, 0, 3, 7, 4, 4, 1, 2, 6, 5]
set_object_model_3d_attrib_mod (ObjectModel3DID, 'polygons', [], Polygons)
这里的Polygons 是点数+ 点的索引。4个点(0,1,2,3),接下来的 4个点(4,5,6,7),这里的Polygons 表示的是正方体的6个面
三、prepare_object_model_3d 函数
为某一操作准备三维对象模型
它计算操作所需的值并将其存储在ObjectModel3D中,从而加快了后续操作。没有必要调用prepare_object_model_3d。但是,如果要多次使用3D对象模型进行相同的操作,则可以更快。
prepare_object_model_3d( : : ObjectModel3D, Purpose, OverwriteData, GenParamName, GenParamValue : )prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
Purpose: ‘shape_based_matching_3d’, ‘segmentation’, ‘distance_computation’, ‘gen_xyz_mapping’
四、create_cube_shape_model_3d函数
生成3D形状模型,这是一个自定义函数
五、获得CamPose
在球坐标系上选取一点作为相机位置,转换为笛卡尔坐标。再通过create_cam_pose_look_at_point 函数确定相机位姿。
convert_point_3d_spher_to_cart (Longitude, Latitude, Distance, '-y', '-z', CamX, CamY, CamZ)
create_cam_pose_look_at_point (CamX, CamY, CamZ, 0, 0, 0, '-y', 0, CamPose)
六、project_cube_image函数
把立方体的三个面,投影到图像上。
七、find_shape_model_3d函数
在图像中找到3D形状模型的最佳匹配
八、project_shape_model_3d函数
将三维形状模型的边缘投影到图像坐标中。
相关文章:
halcon三维点云数据处理(七)find_shape_model_3d_recompute_score
目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…...

vue js实现时钟以及刻度效果
2025.01.08今天我学习如何用js实现时钟样式,效果如下: 一、html代码如下: <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …...

unity学习15:预制体prefab
目录 1 创建多个gameobject 2 创建prefab 2.1 创建prefab (类) 2.2 prefab 是一个文件 2.3 prefab可以导出 3 创建prefab variant (子类) 3.1 除了创建多个独立的prefab, 还可以创建 prefab variant 3.2 他…...

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析
使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架,支持一次编写,多端发布,包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架,具有易…...
MySQL - 子查询和相关子查询详解
在SQL中,子查询(Subquery)和相关子查询(Correlated Subquery)是非常强大且灵活的工具,可以用于执行复杂的数据检索和操作。它们允许我们在一个查询中嵌套另一个查询,从而实现更复杂的逻辑和条件…...
Android 系统签名 keytool-importkeypair
要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包,可以按照以下步骤操作: 步骤 1:准备系统签名文件 从 Android 系统源码中获取系统签名文件,通常位于 build/target/product/security 目录下,包括 pla…...

安卓漏洞学习(十八):Android加固基本原理
APP加固技术发展历程 APK加固整体思路 加固整体思路:先解压apk文件,取出dex文件,对dex文件进行加密,然后组合壳中的dex文件(Android类加载机制),结合之前的apk资源(解压apk除dex以外…...

Docker 使用Dockerfile创建镜像
创建并且生成镜像 在当前目录下创建一个名为Dockerfile文件 vi Dockerfile填入下面配置 # 使用 CentOS 作为基础镜像 FROM centos:7# 设置工作目录 WORKDIR /app# 复制项目文件到容器中 COPY bin/ /app/bin/ COPY config/ /app/config/ COPY lib/ /app/lib/ COPY plugin/ /a…...
【Python运维】利用Python实现高效的持续集成与部署(CI/CD)流程
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 持续集成与部署(CI/CD)是现代软件开发中不可或缺的实践,通过自动化测试、构建和部署流程,显著提高了开发效率与运维质量。本文详细介绍…...

成功!QT 5.15.2编译mysql驱动
首选要说明,5.15与6.7编译驱动是完全不同的。搞错了永远编译不出来。 参考 主要是参考安装QT,安装mysql等。 编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)_mingw编译qt6.7-CSDN博客 复制mysql的include和lib到一个方便的目…...

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装
一、项目创建 创建NDK项目有两种方式,一种从新创建整个项目,一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目: 选择包名、API版本与算法交互的语言: 选择C版本: 创建完之后,可…...

第二届 Sui 游戏峰会将于 3 月 18 日在旧金山举行
3 月中旬,Sui 基金会和 Mysten Labs 将共同举办第二届 Sui 游戏峰会(Sui Gaming Summit),这是一个专注于 Sui 游戏平台的 GDC 周边活动。此次峰会将与旧金山的年度游戏开发者大会(GDC,Game Developers Conf…...

自动驾驶相关知识学习笔记
一、概要 因为想知道SIL、HIL是什么仿真工具,故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著;出版时间:2023年3月 二、图像的分类、分割与检测任务区别 如图所示,这些更高阶的…...

uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」
本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table:一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选,自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…...

新时期下k8s 网络插件calico 安装
1、k8s master节点初始化完毕以后一直处于notreadey状态,一直怀疑是安装有问题或者是初始化有问题(当然,如果真有问题要先解决这些问题),经过不断探索才发现是网络插件没有安装导致的,根据建议安装calico插…...
【SQL】COUNT()函数 用法详解
COUNT()函数 COUNT函数用法:COUNT ( [ALL | DISTINCT] column | expression | *) ALL关键字指示统计所有值,而DISTINCT关键字强制函数仅对不同的值进行操作。 默认情况下,使用ALL选项。条件表达式 COUNT()函数中条件表达式加 OR null。例如…...
【HTML+CSS+JS+VUE】web前端教程-6-图片路径详解
绝对路径 绝对路径是电脑盘符存储与访问的具体位置 E:\xxx\1.jpg <img src"E:\xxx\1.jpg">相对路径 两者相对关系,两者在同一路径下可以直接访问 子级关系:/ 父级关系:../ 同级关系: ./网络路径 具体的网络地址:…...
C++中面向对象的三大特性是什么?
封装(Encapsulation) 概念:封装是把数据和操作数据的函数绑定在一起,对数据的访问进行限制。通过将数据成员设为私有(private)或受保护(protected),并提供公共ÿ…...
Centos 修改 yum 源为阿里云
参考 https://serverfault.com/questions/1161816/mirrorlist-centos-org-no-longer-resolve 修改 Centos 的 yum 源为阿里云 去阿里云 yum 镜像源官网: https://developer.aliyun.com/mirror/ 选择自己对应的操作系统,这里以 centos7 演示…...
Qt之Cannot create children for a parent that is in a different thread问题分析
问题 在多线程场景中,使用QSerialPort,QTcpSocket等QIODevice设备时出现报Cannot create children for a parent that is in a different thread 分析 QObject构造函数中会检查父对象的线程数据与当前对象的线程数据是否一致 static bool check_parent_thread(Q…...

TDengine 开发指南——无模式写入
简介 在物联网应用中,为了实现自动化管理、业务分析和设备监控等多种功能,通常需要采集大量的数据项。然而,由于应用逻辑的版本升级和设备自身的硬件调整等原因,数据采集项可能会频繁发生变化。为了应对这种挑战,TDen…...

什么是预训练?深入解读大模型AI的“高考集训”
1. 预训练的通俗理解:AI的“高考集训” 我们可以将预训练(Pre-training) 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样,大模型在正式诞生前,也要经历一场声势浩大的“题海战术”…...

PG 分区表的缺陷
简介 好久没发文,是最近我实在不知道写点啥。随着国产化进程,很多 oracle 都在进行迁移,最近遇到了一个分区表迁移之后唯一性的问题。oracle 数据库中创建主键或者唯一索引,不需要引用分区键,但是 PG 就不行ÿ…...

html 滚动条滚动过快会留下边框线
滚动条滚动过快时,会留下边框线 但其实大部分时候是这样的,没有多出边框线的 滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行为有关。这种问题可能出现在使用了自定义滚动条样式的情况下。 注意:使用方法 6 好使,其它…...
互联网大厂Java求职面试:云原生架构下的微服务网关与可观测性设计
互联网大厂Java求职面试:云原生架构下的微服务网关与可观测性设计 郑薪苦怀着忐忑的心情走进了会议室,对面坐着的是某大厂的技术总监张总,一位在云原生领域有着深厚积累的专家。 第一轮面试:微服务网关的设计挑战 张总…...

如何以 9 种方式将照片从手机传输到笔记本电脑
使用 USB 电缆可以将照片从智能手机复制到计算机。但是,如果没有 USB 数据线,如何将照片从手机无线传输到笔记本电脑呢?为了解决这个问题,我们搜索并测试了不同的应用程序,然后总结了本指南中分享的 9 个有效选项。您可…...

网络安全逆向分析之rust逆向技巧
rust逆向技巧 rust逆向三板斧: 快速定位关键函数 (真正的main函数):观察输出、输入,字符串搜索,断点等方法。定位关键 加密区 :根据输入的flag,打硬件断点,快速捕获程序中对flag访问的位置&am…...

MySQL性能调优:Mysql8高频面试题汇总
1,主键和唯一键有什么区别? 主键不能重复,不能为空,唯一键不能重复,可以为空。 建立主键的目的是让外键来引用。 一个表最多只有一个主键,但可以有很多唯一键 2,MySQL常用的存储引擎有哪些&…...

【Spark征服之路-2.3-Spark运行架构】
运行架构 Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor …...
【Go面试陷阱】对未初始化的chan进行读写为何会卡死?
Go面试陷阱:对未初始化的chan进行读写为何会卡死?深入解析nil channel的诡异行为 在Go的世界里,var ch chan int 看似人畜无害,实则暗藏杀机。它不会报错,不会panic,却能让你的程序悄无声息地"卡死&qu…...