Haclon例程注解之3d_matching_clamps

这个示例程序显示了怎样使用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 1
    read_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 := ErrorVar
    dev_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)     
endif


dev_set_line_width(2)
*
*在运行图像中寻找三维形状模型的实例
for ImageNo := 1 to 35 by 1
    read_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 - Seconds1
    for I := 0 to |Score| - 1 by 1
        PoseI := 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)
    endfor
    disp_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 ()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值