这个示例程序显示了怎样使用Halcon的3D匹配找到夹具的3D位置并展示了自由运动


*
*
*如果3D形状模型重新在一个新的位置创建,ReCreateShapeModel3D必须设置为True
*inspect_object_model_3d可以用来确定期望的位姿范围,在这个位姿范围内,3D形状模型被创建。
*在全部情况中,inspect_object_model_3d可以可视化3D对象模型
*
ReCreateShapeModel3D := false
*ReCreateShapeModel3D := false
*
*设置相机参数(可以使用calibrate_cameras来获取)
gen_cam_par_area_scan_division (0.01221, -2791, 7.3958e-06, 7.4e-06,308.21, 245.92, 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)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_update_off ()
*
*从一个DXF文件中读取对象模型
read_object_model_3d ('clamp_sloped', 'mm', [], [], ObjectModel3DID, DxfStatus)
*在基于3D形状匹配的使用中准备对象模型
prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
*
*读取一些能够传递到inspect_object_model_3d的示例图像
gen_empty_obj (Images)
for Index := 1 to 3 by 1read_image (Image, 'clamp_sloped/clamp_sloped_' + Index$'02')//$在这里有表示数据类型的 **//作用,连接'02'表示Index是个两位数表示,即使是Index是1,也表示图像名为clamp_sloped_01*连接连个图标对象元组concat_obj (Images, Image, Images)
endfor

图像显示如下图:


*
*检查3D对象模型并详细说明期望的位姿范围,在这一位姿范围内创建3D模型
inspect_object_model_3d (Images, ObjectModel3DID, CamParam, RefRotX, RefRotY, RefRotZ, LongitudeMin, LongitudeMax, LatitudeMin, LatitudeMax, CamRollMin, CamRollMax, DistMin, DistMax, MinFaceAngle)
*
dev_clear_window ()

inspect_object_model_3d  是一个本地函数。用来可视化一个三维对象模型。如果三维对象模型用来创建一个三维对象模型,inspect_object_model_3d 也能用来为 create_shape_model_3d 的输入控制参数找到正确的值。使用方法简单的说明如下:

打开三个窗口和用户互动。左上的窗口显示了三维对象模型的目前相机视图。如果需要,这些背景图也能被看到。这种情况下,背景图一定作为一个元组被传进输入对象参数中。当前显示的背景图的数量显示在左上图的角上。如果当前鼠标模式(显示在图的右上角)设置成 'Move Camera'  ,那么鼠标可以改变当前的相机视图。相机的位置在一个虚拟的球形周围,三维对象模型可以通过按下鼠标左键移动来改变三维对象模型。一个虚拟的光标运动球(由灰度圆圈显示)显示了相机旋转的坐标轴。如果鼠标在圆内,那么相机绕 x 轴和 y 轴旋转,否则旋转绕 z 轴旋转。三维对象模型和相机之间的距离通过按鼠标右键纵向移动可以改变。

如果当前鼠标模式设置维 'Move Image' ,那么背景图通过左键可以移动。例如,使三维对象模型和当前相机视图重合,这样做有效。注意,移动图像后创建人工视图在实际图像上是不能出现的。

右上的窗口可视化在三维对象模型的虚拟球体上的相机位置。另外,三维对象模型显示来自当前相机参考的视图。相机参考位姿通常确定在图中看到的三维对象模型的平均位置,在图像中,三维对象模型能被找到。在位置范围下三维对象模型能找到,通过使用球状坐标经线和纬线。如果纬线和经线都是0,那么当前视图方向和参考位置的视图方向一致。

为了更好的说明球形坐标,纬线的子午线(最长的纬线应该是)和圆圈(都是单步差30°)在球体上可以一起看到。

在移动球体上(上述说明)的相机后黄色的县级坐标系也相应的更新。另外,参考位置角度和当前的球体的坐标也以数字形式显示。注意到参考位置角度的顺序是 'gba',另外,当前相机滚动角度(相机关于参考位置绕 z 轴的旋转角度),三维对象模型中心(最小外接矩形的中心,不需要是CAD 坐标系的原点)和相机,最小的面角也显示。另外,当前相机位置的值(经度,维度,相机滚动角度和距离)选择角度范围的区间也分别的显示。精度和纬度范围以品红区域和蓝色球体的形式显示。

下边的窗口提供一些菜单按钮。

* -  'Set Reference Pose' 设置目前位置的参考位置

* -  'Add to Pose Range' 扩大位置范围到包括当前位置

* -  'Next Image' 显示元组的下一张图

* -  'Previous Image'  显示上一张图

* -  'Increase MinFaceAngle'  增加最小面角,每次一度

* -  'Decrease MinFaceAngle'  减小最小面角,每次一度

* -  'Mouse Mode: Move Camera' 转换到可以移动相机的模式

* -  'Mouse Mode: Move Image' 转换到可以移动图像的模式

* -  'Reset Reference Pose' 设置参考角度为0并重置位置范围

* -  'Reset Pose Range' 缩小位置范围到参考位置

* -  'Hidden Line  Range'隐藏的直线消除,on 或者 off

* -  'Exit'退出 inspect_3d_model 程序并返回参考位置角度,位置范围,最小面角的当前值

这些数值可直接传递给create_shape_model_3d.注意对于大多数应用

if(ReCreateShapeModel3D)*如果需要,重建3D形状模型。请注意,这可能会需要几分钟取决于硬件和位姿范围。Message := 'Creating the 3D shape model (may take several minutes)...'disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')create_shape_model_3d (ObjectModel3DID, CamParam, RefRotX, RefRotY, RefRotZ, 'gba', LongitudeMin, LongitudeMax, LatitudeMin, LatitudeMax, 0, rad(360), DistMin, DistMax, 10, 'min_face_angle', MinFaceAngle, ShapeModel3DID)write_shape_model_3d (ShapeModel3DID, 'clamp_sloped_user.sm3')
else*如果需要从磁盘中读取三维形状模型Message := 'Reading the 3D shape model from disk ...'disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')dev_set_check ('~give_error')dev_error_var (ErrorVar, 1)read_shape_model_3d ('clamp_sloped_35.sm3', ShapeModel3DID)Error := ErrorVardev_set_check ('~give_error')if (Error != H_MSG_TRUE)*如果磁盘上读取不到,创建三维形状模型Message := 'Reading the 3D shape model file from disk ... not found!'Message[1] := 'Creating the 3D shape model (may take several minutes)...'disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')create_shape_model_3d (ObjectModel3DID, CamParam, rad(180), 0, rad(90), 'gba', -rad(35), rad(35), -rad(35), rad(35), 0, rad(360), 0.2, 0.25, 10, [], [], ShapeModel3DID)write_shape_model_3d (ShapeModel3DID, 'clamp_sloped_35.sm3')endif*如果用户生成模型将被使用
*         read_shape_model_3d ('clamp_sloped_user.sm3', ShapeModel3DID)
endifdev_set_line_width(2)
*
*在运行图像中寻找三维形状模型的实例
for ImageNo := 1 to 35 by 1read_image (Image, 'clamp_sloped/clamp_sloped_'+ ImageNo$'02')dev_display (Image)count_seconds (Seconds1)*找到三维形状模型的两个实例find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 5, ['num_matches','pose_refinement'], [2,'least_squares_very_high'], Pose, CovPose, Score)count_seconds (Seconds2)Time := Seconds2 - Seconds1for I := 0 to |Score| - 1 by 1PoseI := Pose[I * 7:I * 7 + 6]CovPoseI := CovPose[I * 6:I * 6 + 5]ScoreI := Score[I]*使用匹配的姿势投影3D形状模型在可视化图像中找到的匹配project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseI, 'true', 0.523599)dev_set_color ('blue')dev_display (ModelContours)*-投影到三维对象模型的坐标体系dev_set_color ('blue')dev_display (ModelContours)* - 显示找到的坐标的参数dev_set_color ('magenta')display_match_pose (ShapeModel3DID, PoseI, WindowHandle)endfordisp_continue_message (WindowHandle, 'black', 'true')stop ()endfor
Message := 'Program terminated. Press \'Run\' to clear the  3D shape model.'
disp_message (WindowHandle, Message, 'window', Height - 30, 12, 'black', 'true')
stop ()dev_update_on ()

Haclon例程注解之3d_matching_clamps相关推荐

  1. halcon例程注解autobahn.hdev

    autobahn.hdev:快速检测车道标志 * autobahn.hdev: 快速检测车道标志 * 1.用扣出部分区域的方式大幅减小干扰,然后用阈值分割进行粗定位 * 2.用粗定位后的区域进行膨胀, ...

  2. 程序阅读_全面详解LTE:MATLAB建模仿真与实现_自学笔记(1)调制与编码_程序阅读

    程序阅读_全面详解LTE:MATLAB建模仿真与实现_自学笔记(1)调制与编码_程序阅读 在粗浅地掌握了LTE知识后,从今天开始对<全面详解LTE:MATLAB建模仿真与实现>一书的学习. ...

  3. Spring注解使用方法

    Spring框架从创建伊始就致力于为复杂问题提供强大的.非侵入性的解决方案.Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop.con ...

  4. zw版_zw中文增强版Halcon官方Delphi例程

    [<zw版·delphi与halcon系列原创教程> zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziw ...

  5. Altium Designer 10 PCB简要设计及其例程

    Altium Designer 10 PCB简要设计及其例程 4.PCB 简要设计 关于对原理图或者说是对整个项目的编译,这一步是为生成网络表,做准备工作,在 project,project opti ...

  6. 枚举注解反射整合详解

    一丶枚举 1 ** 2 * 一.枚举类的使用 3 * 1.枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 4 * 2.当需要定义一组常量时,强烈建议使用枚举类 5 * 3.如果枚举类中只 ...

  7. 【dbux-cxx】简介及例程

    简介 D-Bus是一种高级的进程间通信机制,它由freedesktop.org项目提供,使用GPL许可证发行.D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和L ...

  8. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  9. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

最新文章

  1. sshd服务java教程_Windows下安装OpenSSH服务教程
  2. 重载函数与函数模板(转)
  3. 户频繁点击发送ajax请求
  4. 605. 种花问题 golang 切片越界问题和逻辑操作符的思考
  5. Spring Bean初始化过程
  6. Spring Boot中表格的请求以及表格界面的显示
  7. maya mel uf8_如何在maya中创建uv 的mel语言
  8. python中list的切片和range函数
  9. Linux学习笔记019---Centos7下安装Maven
  10. 打造AS酷炫dimens适配插件
  11. C++笔记------数据类型
  12. Android学习进阶路线导航线路(Android源码分享)
  13. 李宏毅机器学习笔记——深度学习
  14. 小白的linux练习(一)
  15. 使用Unity3D视频转换器TheoraConverter.NET 1.1 Setup转换视频格式为ogv并播放视频
  16. 《维C中国》乡村助农暖人心第三站嘉宝果农场
  17. LeetCode 1101. The Earliest Moment When Everyone Become Friends
  18. 博士申请 | 港中深韩晓光课题组招收与华为中央媒体院联合培养博士生
  19. php编程入门先学什么 PHP程序员需要具备哪些技能
  20. Hive in、exists 和 left semi join

热门文章

  1. 【旧设备重获新生】--TL-WR842N V4.4路由器升级
  2. 项目四总结:MySQL数据表的检索
  3. 计算机网络:以太网中的MTU与MSS
  4. [笔试] 查找兄弟单词(2012/5/6 百度实习笔试题)
  5. Firefox旧版本及插件安装下载
  6. 临床宏基因组学的应用
  7. 微信扫码登录很难吗?5步帮你搞定
  8. 著名弹跳训练法 练成可提高30cm
  9. Java开发真的这么赚钱?连做金融的忍不住转行了
  10. android 图片自动裁剪图片,Android图片选择到裁剪之步步深坑 – 简书