Halcon 表面法向量 pcl

news2024/11/16 22:52:14

一、Halcon  

halcon 案例:

find_surface_model_noisy_data.hdev

思路步骤:

1、读取图像

2、拆通道

3、通过Z通道选出比较合适做匹配的模板

4、通过Z  x y 生成一个模型xyz_to_object_model_3d

5、计算表面法向量并生成表面的模型,这个模型就是匹配的模板 SFM

surface_normals_object_model_3d   create_surface_model

6、将待匹配的图像读入,1 2 3 4

7、类似2D的模板匹配,    find_surface_model (SFM, ObjectModel3DSceneReduced, 0.05, 0.3, 0.65, 'true', ['num_matches','scene_normal_computation','pose_ref_scoring_dist_rel'], [3,'mls',0.03], PoseMLS, ScoreMLS, SurfaceMatchingResultIDMLS)

mls:移动最小二乘法;

8、仿射变换并显示

halcon 代码:

* ***********************************************************************
* Example for surface-based 3D matching with very noisy data
* 
* This example shows the surface-based 3D matching on data taken with a
* time-of-flight camera (TOF/PMD) with very noisy data.
* The model for the matching is created from a reference view of the
* object, i.e., no CAD model is used.
* The created model is then searched for in a number of 3D scenes.
* 
* This example demonstrates how surface-based matching can be made more
* robust with highly noisy data using the 'scene_normal_computation'
* parameter.
* 
* ***********************************************************************
* 
* Initialization
dev_update_off ()
gen_empty_obj (EmptyObject)
ImagePath := 'time_of_flight/'
dev_close_window ()
* 
* ***********************************************************************
* Offline-Phase: Model generation from a reference XYZ Image
* ***********************************************************************
* 
* Load the XYZ images with the reference object
read_image (Image, ImagePath + 'engine_cover_noisy_xyz_01')
decompose3 (Image, Xm, Ym, Zm)
* Remove invalid parts. The sensor returns Z=0 if no measurement is available
threshold (Zm, RegionGood, 1e-30, 1)
reduce_domain (Zm, RegionGood, Zm)
* Smooth Z image
median_image (Zm, ZmMedian, 'circle', 2.5, 'mirrored')
* Remove the background plane and select the ROI containing the model
threshold (ZmMedian, RegionsModel, 0.422, 0.529)
threshold (ZmMedian, RegionsModel, 0.422, 0.529)
connection (RegionsModel, ConnectedModel)
select_shape (ConnectedModel, ModelROI, ['area','holes_num'], 'and', [1500,1], [1e30,1])
* Create the ROI
reduce_domain (Xm, ModelROI, Xm)
* 
* Display model image and ROI
get_image_size (Zm, Width, Height)
dev_open_window (0, 0, Width * 4, Height * 4, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Zm)
dev_set_line_width (2)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (ModelROI)
disp_message (WindowHandle, 'Create surface model from XYZ image region', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
* 
* Create the surface model from the reference view
xyz_to_object_model_3d (Xm, Ym, Zm, ObjectModel3DModel)
* Remove isolated points
connection_object_model_3d (ObjectModel3DModel, 'distance_3d', 0.005, ObjectModel3DConnected)
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 1000, 1e30, ObjectModel3DSelected)
* robust computation of surface normals
surface_normals_object_model_3d (ObjectModel3DSelected, 'mls', [], [], ObjectModel3DModelNormal)
* Create surface model
* mls 移动最小二乘法 
create_surface_model (ObjectModel3DModelNormal, 0.03, 'model_invert_normals', 'true', SFM)
* 
* Display the model
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
Message := 'Surface model'
visualize_object_model_3d (WindowHandle, ObjectModel3DModelNormal, [], [], ['point_size','disp_normals'], [2,'true'], Message, [], Instructions, PoseOut)
* 
* ***********************************************************************
* Online-Phase: Match the reference object in 3D scenes
* ***********************************************************************
* 
ContainsNum := [2,2,1,3,3,2]
for Index := 2 to 7 by 1
    * ***************************************
    * Acquire scene
    * ***************************************
    * Load the XYZ Images
    read_image (Image, ImagePath + 'engine_cover_noisy_xyz_' + Index$'02')
    decompose5 (Image, X, Y, Z, Confidence, Intensity)
    * 
    * Remove points where the sensor returned invalid data
    threshold (Confidence, Region1, 0, 16000)
    reduce_domain (Confidence, Region1, Confidence)
    reduce_domain (Intensity, Region1, Intensity)
    * 
    threshold (Z, Region2, 0.001, 0.65)
    intersection (Region1, Region2, Region)
    reduce_domain (X, Region, X)
    reduce_domain (Y, Region, Y)
    reduce_domain (Z, Region, Z)
    xyz_to_object_model_3d (X, Y, Z, ObjectModel3DScene)
    * 
    if (2 == Index)
        * Visualize the scene to give an impression of the noise
        Message := 'Example scene with noise from time-of-flight sensor'
        visualize_object_model_3d (WindowHandle, ObjectModel3DScene, [], [], 'point_size', 2, Message, [], [], PoseOut1)
    endif
    * 
    * Remove background plane
    threshold (Z, Region, 0.001, 0.55)
    reduce_domain (X, Region, XR)
    reduce_domain (Y, Region, YR)
    reduce_domain (Z, Region, ZR)
    xyz_to_object_model_3d (XR, YR, ZR, ObjectModel3DSceneReduced)
    * 
    * ***************************************
    * Match: Find the reference model in the
    *        3D scene
    * ***************************************
    * 
    * 'scene_normal_computation'    controls how the scene normals are computed
    * 'pose_ref_scoring_dist_rel'   is modified according to the sensor noise
    * 
    count_seconds (T0)
    find_surface_model (SFM, ObjectModel3DSceneReduced, 0.05, 0.3, 0.65, 'true', ['num_matches','scene_normal_computation','pose_ref_scoring_dist_rel'], [3,'mls',0.03], PoseMLS, ScoreMLS, SurfaceMatchingResultIDMLS)
    count_seconds (T1)
    TimeForMatchingMLS := (T1 - T0) * 1000
    * 
    count_seconds (T0)
    find_surface_model (SFM, ObjectModel3DSceneReduced, 0.05, 0.3, 0.65, 'true', ['num_matches','scene_normal_computation','pose_ref_scoring_dist_rel'], [3,'fast',0.03], PoseFast, ScoreFast, SurfaceMatchingResultIDFast)
    count_seconds (T1)
    TimeForMatchingFast := (T1 - T0) * 1000
    stop()
    * 
    * ***************************************
    * Display: Visualize the result(s)
    * ***************************************
    * 
    if (2 == Index)
        Message := 'Normal vectors of default method (\'fast\') vs. accurate method'
        Message[1] := '(\'mls\'). Notice how the normals are noisy and rather incorrect'
        Message[2] := 'for \'fast\', while they are approximately perpendicular to the'
        Message[3] := 'surface for \'mls\'.'
        get_surface_matching_result (SurfaceMatchingResultIDFast, 'sampled_scene', 0, SampledSceneFast)
        get_surface_matching_result (SurfaceMatchingResultIDMLS, 'sampled_scene', 0, SampledSceneMLS)
        * Select scene parts close to the found model
        distance_object_model_3d (SampledSceneFast, ObjectModel3DModel, PoseMLS[7:13], 0, 'invert_pose', 'true')
        distance_object_model_3d (SampledSceneMLS, ObjectModel3DModel, PoseMLS[7:13], 0, 'invert_pose', 'true')
        select_points_object_model_3d (SampledSceneFast, '&distance', 0, 0.01, SceneOnModelFast)
        select_points_object_model_3d (SampledSceneMLS, '&distance', 0, 0.01, SceneOnModelMLS)
        max_diameter_object_model_3d (ObjectModel3DModel, Diameter)
        * Visualize scenes next to each other
        rigid_trans_object_model_3d (SceneOnModelMLS, [0,Diameter,0,0,0,0,0], ObjectModel3DRigidTrans)
        create_pose (-0.2, 0.07, 3.0, 3.8, 2.0, 270, 'Rp+T', 'gba', 'point', Pose)
        visualize_object_model_3d (WindowHandle, [SceneOnModelFast,ObjectModel3DRigidTrans], [], Pose, ['point_size','disp_normals','color_0','color_1'], [2,'true','red','green'], Message, ['fast','mls'], [], PoseOut1)
    endif
    * 
    * Prepare the visualization of the result(s)
    rigid_trans_object_model_3d (ObjectModel3DModel, PoseFast, ObjectModel3DResultFast)
    rigid_trans_object_model_3d (ObjectModel3DModel, PoseMLS, ObjectModel3DResultMLS)
    * 
    * Visualize result(s)
    NumGT := ContainsNum[Index - 2]
    Message := 'Scene: ' + Index + ' (contains ' + NumGT + ' object' + ['s',''][1 == NumGT] + ')'
    if (|ScoreFast| > 0)
        Message[1] := 'Fast (yellow): Found ' + |ObjectModel3DResultFast| + ' object(s) in ' + TimeForMatchingFast$'.3' + ' ms'
        ScoreString := sum(ScoreFast$'.2f' + ' / ')
        Message[2] := '  Score(s): ' + ScoreString{0:strlen(ScoreString) - 4}
    else
        Message[1] := 'Fast (yellow): No objects found'
        Message[2] := ''
    endif
    Message[3] := 'MLS (green): Found ' + |ObjectModel3DResultMLS| + ' object(s) in ' + TimeForMatchingMLS$'.3' + ' ms'
    ScoreString := '' + sum(ScoreMLS$'.2f' + ' / ')
    Message[4] := '  Score(s): ' + ScoreString{0:strlen(ScoreString) - 4}
    * 
    CYellow := gen_tuple_const(|ObjectModel3DResultFast|,'yellow')
    CGreen := gen_tuple_const(|ObjectModel3DResultMLS|,'green')
    NYellow := [0:|ObjectModel3DResultFast| - 1] + 1
    NGreen := [0:|ObjectModel3DResultMLS| - 1] + 1 + |ObjectModel3DResultFast|
    * 
    dev_clear_window ()
    visualize_object_model_3d (WindowHandle, [ObjectModel3DScene,ObjectModel3DResultFast,ObjectModel3DResultMLS], [], [], ['point_size_0','color_0','color_' + NYellow,'color_' + NGreen], [2,'gray',CYellow,CGreen], Message, [], Instructions, PoseOut)
endfor

 

二、生成表面法向量Halcon 

surface_normals_object_model_3d

surface_normals_object_model_3d (ObjectModel3DSelected, 'mls', [], [], ObjectModel3DModelNormal)

ObjectModel3D (input_control)  

Method (input_control)
Default value: 'mls'
List of values: 'mls', 'triangles', 'xyz_mapping'

GenParamName (input_control) 
Default value: []
List of values: 'mls_abs_sigma', 'mls_force_inwards', 'mls_kNN', 'mls_order', 'mls_relative_sigma'


GenParamValue 
Default value: []
Suggested values: 10, 20, 40, 60, 0.1, 0.5, 1.0, 2.0, 0, 1, 2, 'true', 'false'

ObjectModel3DNormals (output_control) 

halcon 计算两个向量之间的夹角

vec1 := [Normals[0],Normals[1], Normals[2]] 
vec1 := [1,0,0] 
vec2 := [0, 0, 1.0]
dop_r:=vec1[0]*vec2[0] +vec1[1]*vec2[1]+vec1[2]*vec2[2]
squre_v1:=sqrt(vec1[0]*vec1[0] +vec1[1]*vec1[1]+vec1[2]*vec1[2])
squre_v2:=sqrt(vec2[0]*vec2[0] +vec2[1]*vec2[1]+vec2[2]*vec2[2])
s:=number(dop_r/(squre_v1*squre_v2))
tuple_acos(s,selta)

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

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

相关文章

Linux:apache网页优化

Linux:apache网页优化 一、Apache 网页优化二、网页压缩2.1 检查是否安装 mod_deflate 模块2.2 如果没有安装mod_deflate 模块,重新编译安装 Apache 添加 mod_deflate 模块2.3 配置 mod_deflate 模块启用2.4 检查安装情况,启动服务2.5 测试 m…

字节跳动测试岗,3面都过了,HR告诉我是这个原因才被刷...

说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的,几轮面试也通过了,最后没offer,自己只想到下面几个原因: 虚报工资,比实际高30%;有更好的人选,这个可能性不大,我看还在…

医院检验科LIS系统的常规检验项目有哪些?

医院检验科LIS系统的常规检验项目包括: 白细胞数目、中性粒细胞数目、淋巴细胞数目、单核细胞数目、嗜酸性粒细胞数目、嗜碱性粒细胞数目、中性粒细胞百分比、 淋巴细胞百分比、单核细胞百分比、嗜酸性粒细胞百分比、嗜碱性粒细胞百分比、红细胞数目、血红蛋白、红…

淘宝太细了:mysql 和 es 的5个一致性方案,你知道吗?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如拼多多、极兔、有赞、希音的面试资格,遇到一几个很重要的面试题: 说5种mysql 和 elasticsearch 数据一致性方案 与之类似的、其他小伙伴遇到过的问题还…

电脑怎么隐藏文件夹?这样做,快速搞定!

案例:我想把一些敏感和重要的文件夹隐藏起来,不想别人看到它们。在电脑上如何隐藏电脑文件夹?有没有小伙伴知道如何操作?急需! 我们在使用电脑的过程中,会产生大量文件,有些文件可能包含私密信…

4.1 Spark SQL概述、数据帧与数据集

一、数据帧 - DataFrame (一)准备工作 1、准备数据文件 2、启动Spark Shell (二)加载数据为Dataset 1、读文件得数据集 2、显示数据集内容 3、显示数据集模式 (三)给数据集添加元数据信息 1、定…

强!PCB“金手指”从设计到生产全流程

在电脑内存条、显卡上,有一排金黄色导电触片,就是大家俗称的“金手指”。 在PCB设计制作行业中的“金手指”(Gold Finger,或称Edge Connector),是由connector连接器作为PCB板对外连接网络的出口。 关于“金手指”你知道多少呢&a…

像核战争一样,AI可能灭绝人类:Geoffrey Hinton、Sam Altman等百名专家签署了一封公开信

多位图灵奖得主、顶级 AI 公司 CEO、顶尖高校教授,与数百位在各自领域享有话语权的专家,共同签署了一份公开信,内容简单却有力: 降低 AI 灭绝人类的风险,应该与大流行病、核战争等其他社会规模的风险一样,…

AI落地:儿童节礼物指南

这个儿童节,用AI做点不一样的礼物,给孩子一个惊喜。 可行清单: 写走心的贺卡(增强表达能力,培养心思细腻)用AI让孩子的画的小人动起来(激发创造力,培养想象力)把孩子的…

Ansys Zemax | 如何模拟部分反射和散射的表面

这篇文章介绍了如何模拟一个部分反射的表面,该表面会根据指定的散射分布对一部分入射光能量进行散射。本文介绍的示例包含部分吸收以及部分镜面反射的情况。(联系我们获取文章附件) 介绍 使用 OpticStudio 非序列模式模拟散射和膜层的能力,我们可以模拟一…

MFC按钮中添加图标

目录 一、创建对话框 二、 开始添加 1、将.ico图片放进res路径下 2、添加资源 3、添加按钮 4、将按钮属性中icon修改为true 5、代码添加 一、创建对话框 首先需要创建个对话框程序,参考之前写的博客: mfc入门基础(三)创…

浅谈智能化配电室在居民小区的建设应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:近年来居民小区配电室的数量增长快且设备情况较复杂,以致巡视效果不理想、缺陷和事故处理不及时,亟需建立一套智能化的配电室监控系统。按照实用性、统一性、分层和模块化设计…

RobotFramework接口测试方案

1. Robot FrameWork介绍 1.1 介绍 Robot Framework是用于验收测试和回归测试的通用测试自动化框架。它使用易于理解的表格数据语法,非常友好的实现了关键字驱动和数据驱动模式。它的测试功能可以通过使用Python或Java实现的测试库进行扩展,用户可以使用…

RCE代码及命令执行漏洞全解(30)

web应用中,有时候程序员为了考虑灵活性,简洁性,会在代码中调用代码或执行命令执行函数去处理。 比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这些字符串,将代码执行漏洞,同…

华为OD机试真题B卷 Java 实现【求最大连续bit数】,附详细解题思路

一、题目描述 求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。 二、输入描述 输入一个int类型数字。 三、输出描述 输出转成二进制之后连续1的个数。 四、解题思路 首先通过输入获取一个 int 类型的数…

K8s环境使用Triton实现云端模型推理

前置条件:K8集群、helm 1、以模型名作为目录名,创建目录 mkdir resnet50_pytorch 2、将模型文件、配置文件(输入、输出等)存到刚创建的目录下,resnet50_pytorch目录下文件层级结构如下 model-respository/ └── …

【C++模版】模版进阶 {非类型模版参数; 模版的特化; 模版的分离编译; 模版总结}

一、非类型模版参数 模板参数分类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来…

mysql中的锁浅析

前言 MySQL 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为不正确的锁机制使用很容易出现严重的性能瓶颈和数据不一致等…

尚硅谷大数据hadoop教程_mapReduce

p67 课程介绍 p68概述 p69 mapreduce核心思想 p70 wordcount源码 序列化类型 mapReduce三类进程 p71 编程规范 用户编写的程序分成三个部分:Mapper、Reducer和Driver。 P72 wordcount需求案例分析 p 73 -78 案例环境准备 (1)创建maven…

写代码?文心一言or文言文,谁更胜一筹?新工具或许可堪重任

中国版的ChatGPT“文心一言”写代码能力尚浅 被称为中国版的“ChatGPT”的“文心一言”可以说是上市几个月了,很多用户都受到了邀请码来体验,遗憾的是,小编早就申请了,但还在排队等待中。虽然没有亲自体验过百度的“文心一言”&a…