Halcon中的一些3D算子

这篇具有很好参考价值的文章主要介绍了Halcon中的一些3D算子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、记录一些Halcon里的关于3D的算子

1.read_object_model_3d  从文件读取一个3d模型

如下图,读的一个ply文件出来是个3d点云模型

Halcon中的一些3D算子

Halcon中的一些3D算子

 2.visualize_object_model_3d  交互式展示3d模型

即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移,缩放来观察操作

算子签名

visualize_object_model_3d( : : WindowHandle, ObjectModel3D, CamParam, PoseIn, GenParamName, GenParamValue, Title, Label, Information : PoseOut)

WindowHandle:显示窗口句柄

ObjectModel3D:需要展示的3d模型

CamParam:假想的观察这个模型的一个面阵相机的内参

PoseIn:这个模型的3d姿态

GenParamName:参数名

GenParamValue:参数值

Title:展示在窗口左上角的文字

Label:在每个3d模型位置显示的文本

Information:窗口左下角显示的信息

PoseOut:用户调整模型姿态后输出这个3d姿态

其中参数名和参数值有很多,

举例 参数名color 参数值green    将模型颜色变为绿色

参数名 color_attrib 参数值coord_z 类似于z轴方向的渐变色ba

参数名 disp_pose 参数值 true  显示出坐标轴

3.connection_object_model_3d  分离3d模型中的各个连通域

算子签名

connection_object_model_3d( : : ObjectModel3D, Feature, Value : ObjectModel3DConnected)

可以通过调节distance_3d参数,把一些噪点分离出来

4.select_object_model_3d  根据全局特征从3d模型组中选取符合特征的3d模型们

算子签名

select_object_model_3d( : : ObjectModel3D, Feature, Operation, MinValue, MaxValue : ObjectModel3DSelected)

如可以设置参数'num_points'  模型点的数量,去除一部分点数少的模型,如噪点

5.union_object_model_3d 合并多个3d模型们成一个新的3d模型

算子签名

union_object_model_3d( : : ObjectModels3D, Method : UnionObjectModel3D)

3、4、5的操作可以用来去除噪点,如下图,去除噪点之后的3d模型

Halcon中的一些3D算子

 6.surface_normals_object_model_3d 计算3d模型的表面法线

算子签名

surface_normals_object_model_3d( : : ObjectModel3D, Method, GenParamName, GenParamValue : ObjectModel3DNormals)

这个算子计算模型表面法线。在3d点云匹配创建3d匹配模型的时候,需要模型带表面法线信息才可以用来创建。

7.max_diameter_object_model_3d 计算3d模型最大直径

8. create_pose 创建3D位姿

算子签名:

create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)

这个算子有一些参数,主要是通过各方向平移和旋转得到一个新的3d位姿。后面一些参数控制平移旋转先后顺序还有绕哪个坐标系下的轴,详细可查对应算子说明。

9.rigid_trans_object_model_3d 将刚性三维变换应用于这个3d模型

可以用这个算子对某个模型进行刚性变换、即平移和旋转。可以用上个算子的pose作为变换参数

如下图,做了变换

Halcon中的一些3D算子

 变换后,原点位置,姿态都变了

Halcon中的一些3D算子

10.sample_object_model_3d  对3d模型进行采样

算子签名

sample_object_model_3d( : : ObjectModel3D, Method, SampleDistance, GenParamName, GenParamValue : SampledObjectModel3D)

SampleDistance:这个采样距离,隔多少距离采集一个点,可以先求出3d模型的最大直径乘以一个比例系数来得到这个采样距离,如Diameter*0.003 最大直径的0.003倍,及最大直径上取333个采样点,乘的系数越小,点越多。

11.create_surface_model 创建一个用于基于曲面3d匹配的数据结构

算子签名

create_surface_model( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)

RelSamplingDistance:这里的相对采样距离跟上面那个采样距离不一样,填0.05即取总点数乘以0.05个点,越小点越少

Halcon中的一些3D算子

 12.find_surface_model 在3d场景中找到模型的最佳匹配

算子签名:

find_surface_model( : : SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID)

挺多参数,不一一写了

13.refine_surface_model_pose 优化三维场景中曲面模型的姿势

上一步算出来的姿态可以再给进这个算子优化一下

14.pose_invert 反转姿态

这样上面find的姿态,是预先做的模型通过变换匹配到场景中的位置,反转这个姿态,可以将场景变换回模型的位置,用于后期分析处理

用rigid_trans_object_model_3d变换后,和之前创建的3d模型匹配上了,如下图显示

Halcon中的一些3D算子文章来源地址https://www.toymoban.com/news/detail-510824.html

二、halcon测试代码:

dev_close_window ()
dev_open_window (0, 0, 1200, 800, 'black', WindowHandle)
*读取单帧点云ply文件
read_object_model_3d('D:/项目/tray盘/230425-汇川-tray盘/3d导出.ply', 'mm', [], [], ObjectModel3D, Status)




Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'

Message := 'Hik3D PointCloud'
*虚拟化模型并且显示
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)
dev_clear_window ()

connection_object_model_3d (ObjectModel3D, 'distance_3d', 0.001, ObjectModel3DConnected)

select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 2000, 1e30, ObjectModel3DSelected)

union_object_model_3d (ObjectModel3DSelected, 'points_surface', UnionObjectModel3D)


visualize_object_model_3d (WindowHandle, UnionObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)

dev_clear_window ()
surface_normals_object_model_3d (UnionObjectModel3D, 'mls', [], [], ObjectModel3DNormals)


max_diameter_object_model_3d (ObjectModel3DNormals, Diameter)

create_pose (0.13, 0.13, 0.028, 0, 0,180, 'Rp+T', 'gba', 'point', Pose4)
rigid_trans_object_model_3d (ObjectModel3DNormals, Pose4, ObjectModel3DRigidTrans1)

sample_object_model_3d (ObjectModel3DRigidTrans1, 'fast',Diameter*0.003, [], [], SampledObjectModel3D)



visualize_object_model_3d (WindowHandle, SampledObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)
dev_clear_window ()
create_surface_model (ObjectModel3DRigidTrans1, 0.01, [], [], SurfaceModelID)


read_object_model_3d ('D:/项目/tray盘/230425-汇川-tray盘/带围挡/1-3d导出', 'mm', 'convert_to_triangles', 'true', ObjectModel3D1, Status1)


sample_object_model_3d (ObjectModel3D1, 'fast', Diameter*0.01, [], [], SampledObjectModel3D1)

find_surface_model (SurfaceModelID, SampledObjectModel3D1, 0.02, 0.2, 0, 'false', [], [], Pose, Score, SurfaceMatchingResultID)

refine_surface_model_pose (SurfaceModelID, SampledObjectModel3D1, Pose, 0, 'false', [], [], Pose1, Score1, SurfaceMatchingResultID1)


pose_invert (Pose1, PoseInvert)

rigid_trans_object_model_3d (SampledObjectModel3D1, PoseInvert, ObjectModel3DRigidTrans)
dev_clear_window ()

create_pose (-0.05, -0.06, 10, 134, 340, 235, 'Rp+T', 'gba', 'point', Pose2)

create_pose (-0.05+Pose1[0], -0.06+Pose1[1], 10+Pose1[2], 134+Pose1[3], 340+Pose1[4], 235+Pose1[5], 'Rp+T', 'gba', 'point', Pose3)



visualize_object_model_3d (WindowHandle, [ObjectModel3DRigidTrans,ObjectModel3DRigidTrans1], [], Pose2, ['color_0','color_1','disp_pose'], ['gray','green','true'], [], [], [], PoseOut1)

dev_clear_window ()
visualize_object_model_3d (WindowHandle, [ObjectModel3D1,ObjectModel3DRigidTrans1], [], [Pose3,Pose2], ['alpha','color_0','color_1','disp_pose'], [0.5,'yellow','green','true'], [], [], [], PoseOut1)

到了这里,关于Halcon中的一些3D算子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HALCON visualize_object_model_3d 算子原理的理解以及使用HSmartWindowControlWPF重实现

    1. 参数说明 WindowHandle:显示点云的窗口句柄 ObjectModel3D:待显示的点云对象 CamParam:相机内参 此处的相机指的是一个虚拟相机,为观察点云提供一个视角,如下图,点云在一个场景坐标系中(SCS),我们在WindowHandle中看到的点云效果就是通过此虚拟相机看到的点云 该值可以

    2024年02月14日
    浏览(79)
  • 嚼一嚼Halcon中的3D手眼标定

    一、问题概述 1、何为手眼标定? 要让机器人的手抓住杯子,就必须知道 杯子跟手的相对位置关系 ,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道 机器人的手和眼睛的转换关系 ,就可以随时抓取机器人眼睛所看到的物体了。 2、手眼标定的2种形式 1)

    2024年02月04日
    浏览(42)
  • 3D Matching:实现halcon中的find_surface_model

            halcon中的三维匹配大致分为两类,一类是基于形状的(Shape-Based),一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体,3D物体模型必须是CAD模型,且几何边缘清晰可见,使用的相机也要预先进行校准。基于表面的匹配可用于3D场景中

    2024年04月11日
    浏览(42)
  • Halcon常用算子汇总

    持续更新ing

    2024年02月16日
    浏览(36)
  • Halcon常用算子(库函数)整理

    新手在刚接触Halocon时往往不明所以,而官方文档上的解释又让初学者云里雾里,本文整理了halocon常用算子(库函数),供开发者快速查阅。 tuple_length(Area0,len) 数组里元素的个数 tuple_find_first(Area0,sMax,i) 找到第一个是sMax的,返回索引 创建数组 tuple_gen_const( : : Length, Const : Newtupl

    2024年01月21日
    浏览(57)
  • Halcon滤波器 laplace 算子

    使用laplace 算子对图像进行二次求导,会在边缘产生零点,因此该算子常常与zero_crossing算子配合使用。求出这些零点,也就得到了图像的边缘。同时,由于laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此在检测之前应先进行去噪处理。 该算子的原型如下: 其

    2024年02月01日
    浏览(41)
  • 关于Matterport3D的一些学习

    这是一个大型RGB-D数据集,包含90个建筑规模场景,由194400个RGB-D图像组成的10800个全景图构成。注释提供有 表面重建 、 相机姿势以及2D和3D语义分割 。精确的全局对齐和整个建筑的全面、多样化的全景视图集实现了各种监督和自我监督的计算机视觉任务,包括关键点匹配、视

    2024年01月17日
    浏览(28)
  • 关于laravel使用Elastic Search的一些记录

    1. 准备工作 因为我本地php版本是7.3.4,不支持太高的es。 所以使用如下环境: laravel6 + php7.3.4 + elastic search 7.17.2 2. 本地安装elastic search 注意事项: 如果是8以上版本,初次启动时会生成密码。安装成功以后,访问 https://localhost:9200/ ,会提示输入密码。用户名为elastic,密码就是

    2024年02月11日
    浏览(54)
  • 关于工作中爬取网站的一些思路记录

    声明:只是因为工作中需要,且基本不会对别人的网站构成什么不好的影响,做个思路记录!!! 尊重网站所有者、控制请求频率、遵守网站规则、尊重个人隐私 平常工作中难免会遇到需要爬取别人网站的需求,例如爬取兑换之类的流程,把接口爬取下来封装到项目中,这

    2024年02月07日
    浏览(54)
  • Halcon边缘检测Sobel、Laplace和Canny算子

    提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。        除了阈值分割外,也可以通过检测区域的边缘得到目标区域。区域的边缘像素的灰度值往往会发生灰度上的突变,针对这些跳跃性的突变进行检测和计算,可以得到区域的边缘轮廓

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包