HALCON的基础运用案例:- 例1- 3D点云的分割

news2025/1/18 4:31:44

前言:

在这个例子里面展示了用HALCON的操作函数segment_object_model_3d,来把一个输入的2.5D的3D图像进行分割。这里因为图像是一组圆柱体,有运用了一个物体的判别操作函数:dev_display_fitting_results。然后,自动给出了region的划分。


程序说明:

步骤1:读取2.5D的数据:

read_image (XYZ, '3d_machine_vision/segmentation/3d_primitives_xyz_01.tif')

数据就是几个圆柱体:

步骤2,转化为3D数据

access_channel (XYZ, X, 1)
access_channel (XYZ, Y, 2)
access_channel (XYZ, Z, 3)

【案】这时候,应该是拿了X,Y,Z三个坐标视图数据:【Franlin案,2.5D也许就是理解为通过三视图来转化得到的3D图像?感觉又不是,因为X,Y,Z的轮廓几乎是一样的角度】我们看给出的变量图如下:

X,Y,Z几乎为一样的角度,【案】也许是双目视图。

如果看X,Y的3D视图:都是一个平面

 当然Z是三维图形:

步骤3:准备分割:

xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)
prepare_object_model_3d (ObjectModel3DID, 'segmentation', 'false', 'max_area_holes', 100)

这里先通过xyz_to_object_model_3d【具体,参考我的其他博客说明】,把刚才原始的2.5D的图像,搞成了一个3D点云模型ObjectModel3DID:然后在prepare_object_model_3d【依据设定准备处理的内存等】里面设定好分割的参数准备和设定。

步骤4:开始分割:

ParSegmentation := ['max_orientation_diff','max_curvature_diff','output_xyz_mapping','min_area']
ValSegmentation := [0.13,0.11,'true',150]
ParFitting := ['primitive_type','fitting_algorithm']
ValFitting := ['all','least_squares_huber']
* Segmentation and fitting is done in one step,
* because the parameter 'fitting' is set to 'true' by default
segment_object_model_3d (ObjectModel3DID, [ParSegmentation,ParFitting], [ValSegmentation,ValFitting], ObjectModel3DOutID)

 输入,输出的模型数据比较如下:

 每一栏都是一个分割后的3D实体:

然后,Primitive Tpye应该为基本的3D模型,【大概,因为不同的角度,有不同的识别类型】

步骤5,显示分割的模型:

步骤6,运用fitting:


案例源码:

* ***********************************************************************
* This example program shows how to use the operator
* segment_object_model_3d in HALCON. First, the 2.5D
* input image is segmented. Additionally, with the same
* operator, a fitting is performed. The result of the
* 3D segmentation is converted to a region and is
* displayed. Finally, the values of the fitted radii
* for the cylinders and spheres are visualized.
* ***********************************************************************
dev_update_off ()
dev_close_window ()
* Input: 2.5D image
read_image (XYZ, '3d_machine_vision/segmentation/3d_primitives_xyz_01.tif')

dev_open_window_fit_image (XYZ, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* Access to (x-, y-, z-)coordinates
access_channel (XYZ, X, 1)
access_channel (XYZ, Y, 2)
access_channel (XYZ, Z, 3)
* 
Message := 'Generate a 3D object model from an'
Message[1] := 'XYZ image and segment primitives'
Message[2] := '(spheres, cylinders, planes) in it:'
dev_display (Z)
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Prepare the segmentation
xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)
prepare_object_model_3d (ObjectModel3DID, 'segmentation', 'false', 'max_area_holes', 100)
ParSegmentation := ['max_orientation_diff','max_curvature_diff','output_xyz_mapping','min_area']
ValSegmentation := [0.13,0.11,'true',150]
ParFitting := ['primitive_type','fitting_algorithm']
ValFitting := ['all','least_squares_huber']
* Segmentation and fitting is done in one step,
* because the parameter 'fitting' is set to 'true' by default
segment_object_model_3d (ObjectModel3DID, [ParSegmentation,ParFitting], [ValSegmentation,ValFitting], ObjectModel3DOutID)
* Show the result of the segmentation
dev_set_colored (12)
for Index := 0 to |ObjectModel3DOutID| - 1 by 1
    object_model_3d_to_xyz (XTmp, YTmp, ZTmp, ObjectModel3DOutID[Index], 'from_xyz_map', [], [])
    get_domain (ZTmp, DomainTmp)
    if (Index == 0)
        copy_obj (DomainTmp, Domain, 1, 1)
    else
        concat_obj (Domain, DomainTmp, Domain)
    endif
endfor
dev_display (Domain)
disp_message (WindowHandle, '3D Segmentation', 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle, 'Segmented objects: ' + |ObjectModel3DOutID|, 'window', 40, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Show the result of the fitting
dev_clear_window ()
dev_display_fitting_results (RegionCylinder, RegionSphere, RegionPlane, RegionNone, ObjectModel3DOutID, WindowHandle, [])
* 
* Example code, if further inspections should be made:
* 
* Store only the data of the primitive to save memory
for Index := 0 to |ObjectModel3DOutID| - 1 by 1
    * Copy only the data of the primitive
    copy_object_model_3d (ObjectModel3DOutID[Index], 'primitives_all', CopiedObjectModel3DID)
    * Further inspections
    * .....
    * .....
endfor
dev_update_on ()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 代码调试

from pdb import set_trace as stx 是一个Python代码中常用的调试技巧之一,它用于在代码中插入断点以进行调试。这行代码的作用是将Python标准库中的 pdb(Python Debugger)模块中的 set_trace 函数导入,并将其重命名为 stx&#x…

ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题

目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …

DependsOn注解失效问题排查

文章目录 前言一、现象描述1.1.背景描述1.2.第一次修改,使用DependsOn注解1.3.第二次修改,设置方法入参 二、看看源码2.1.Spring实例化的源码2.2.调试2.3.验证 总结 前言 最近几天遇到一个比较有意思的问题,发现Spring的DependsOn注解失效&a…

强化学习框环境 - robogym - 学习 - 4

强化学习环境 - robogym - 学习 - 4 文章目录 强化学习环境 - robogym - 学习 - 4项目地址为什么选择 robogym如何消去目标位置的阴影?如何让物体颜色变得正确? 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机…

小白自学笔记—网络安全(黑客笔记)

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟入…

29 WEB漏洞-CSRF及SSRF漏洞案例讲解

目录 CSRF漏洞解释,原理等CSRF漏洞检测,案例,防御等防御方案2、设置随机Token3、检验referer来源 SSRF漏洞会比csrf漏洞重要一些SSRF_PHP,JAVA漏洞代码协议运用演示案例:SSRF_漏洞代码结合某漏洞利用测试 如何查找ssrf漏洞 SSRF漏…

测量温度的优选模块:新型设备M-THERMO3 16

| 具有16个自由选择通道的新型温度测量设备M-THERMO3 16 IPETRONIK推出的温度测量设备——M-THERMO3 16作为新一代设备的首个模块,它为模块化测量技术确立了标准。该模块具有16个通道,各通道不仅分辨率高达24位ADC,而且能够自由选择热电偶类…

2023Q3数据安全政策、法规、标准及报告汇总(附下载)

数据安全处罚事件逐年升高,2023年呈爆发式增长。 截至2023年8月31日,南都大数据研究院通过各地行政执法公示平台、媒体报道等公开渠道收集到146起依据《数据安全法》作出行政处罚决定的案例。2021年公示5起,2022年公示11起,2023年…

如何通过设备维护管理系统实现全员生产维护TPM

前面我们介绍了《什么是全员生产维护TPM?》,接下来我们探讨如何结合PreMaint的设备维护管理系统来实现全员生产维护TPM。 在现代制造业中,设备的可靠性和生产效率对企业的竞争力至关重要。为了实现全员生产维护(Total Productive …

记录vue开发实例

封装的表格组件 <template><div><div style"width: 100%" v-if"showList"><el-table v-loading.lock"loading" :data"dataList":header-cell-style"{background: #F2FCFE,fontSize: 14px,color: #50606D}&…

8.2 JUC - 6.CyclicBarrier

目录 一、是什么&#xff1f;二、使用demo三、注意 一、是什么&#xff1f; CyclicBarrier &#xff1a; 循环栅栏&#xff0c;用来进行线程协作&#xff0c;等待线程满足某个计数。构造时设置计数个数&#xff0c;每个线程执行到某个需要“同步”的时刻调用 await() 方法进行…

【数据结构】栈和队列-- OJ

目录 一 用队列实现栈 二 用栈实现队列 三 设计循环队列 四 有效的括号 一 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct …

数据结构 | (三) Stack

栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&#xff1a;栈…

c#学习系列相关之多线程(三)----invoke和begininvoke

一、invoke和BeginInvoke的作用 invoke和begininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口&#xff0c;举个例子&#xff1a;主线程中存在一个文本控件&#xff0c;在一个子线程中要改变该文本的值&#xff0c;此…

(四)列表、元组、字典和集合

Python列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dict&#xff09;和集合&#xff08;set&#xff09;详解 Python 序列&#xff08;Sequence&#xff09;是指按特定顺序依次排列的一组数据&#xff0c;它们可以占用一块连续的内…

【C/C++】关于vector迭代器失效问题

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; vector迭代器失效问题 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.10.8 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就…

C++变量默认初始化

初始化不是赋值&#xff0c;初始化是指创建变量时赋予一个初始值&#xff0c;赋值是指将变量的当前值擦除&#xff0c;赋予新值。 如果定义变量时没有初始化&#xff0c;则变量会被系统默认初始化。“默认值”取决于变量的&#xff1a;类型位置 startmindmap * C变量默认初始…

邮件群发工具哪个好

邮件群发是一种通过电子邮件向多个收件人发送邮件的方式。同时&#xff0c;邮件群发也是一种低成本、高回报的营销手段。因此邮件群发被广泛应用于各种营销活动中&#xff0c;例如活动邀请、新品上线、产品促销等等。而群发邮件最有效的方式就是借助邮件群发工具&#xff0c;而…

常用排序算法详解

1.冒泡排序原理示例代码实现 2.快速排序原理示例代码实现 3.插入排序原理示例代码实现 4.希尔排序原理示例代码实现 5.选择排序原理示例代码实现 6.堆排序原理示例代码实现 7.归并排序原理示例代码实现 本文讲述了常见的排序算法的执行过程&#xff0c;有详细实现过程举例 1.冒…

arm 点灯实验代码以及现象

.text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000A28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) 第4位置1 STR R1,[R0] 1.设置GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R…