halcon案例注释与分析:align_measurements.hdev

源码以及注释如下


  • This example program uses shape-based matching to align ROIs for the measure
  • tool, which then inspects individual razor blades.
  • The program can be run in two modes: (1) with the full affine transformation
  •                                                            (2) using translate_measure
    
  • Modify the next line to switch between the modes.
    USING_TRANSLATE_MEASURE := 0
  • 此示例程序使用基于形状的匹配来对齐测量工具的 ROI,然后检测单个剃须刀片。
  • 程序可以在两种模式下运行:(1) 全仿射变换
  • (2) 使用 translate_measure
  • 修改下一行以切换模式。

  • general configuration of HDevelop
    dev_update_window (‘off’)
  • image acquisition and window size
    read_image (ModelImage, ‘razors1’) *读图
    get_image_pointer1 (ModelImage, Pointer, Type, Width, Height)*只输入读图,输出图像指针(指向halcon图像)和相关信息
    dev_close_window ()*关闭激活的图形窗口
    dev_open_window (0, 0, Width, Height, ‘white’, WindowHandle)*据指定信息创建一个窗口。
    dev_set_part (0, 0, Height - 1, Width - 1)
    dev_display (ModelImage)*在当前图像窗口显示指定图像
  • colors and other settings for the visualization
    dev_set_color (‘cyan’)*指定输出颜色
    dev_set_draw (‘margin’)**指定region模式
    dev_set_line_width (2)*指定画线时的线宽
    stop ()*暂停程序执行 按f5继续
  • ------------------- start of the application ----------------
  • -> select the model object
    Row1 := 46
    Column1 := 57
    Row2 := 79
    Column2 := 94
    gen_rectangle1 (ROIPart1, Row1, Column1, Row2, Column2)
    gen_rectangle1 (ROIPart2, Row1 + 364, Column1 + 13, Row2 + 364, Column2 + 13)
    *创建平行于坐标系的矩形框
    union2 (ROIPart1, ROIPart2, ModelROI)*返回矩形框的联合
    area_center (ModelROI, Area, CenterROIRow, CenterROIColumn)*返回面积和中心
    dev_display (ModelImage)
    dev_display (ModelROI)
    stop ()
  • -> create the model
    reduce_domain (ModelImage, ModelROI, ImageROI)* 裁剪指定的区域
    create_shape_model (ImageROI, 4, 0, 0, ‘auto’, ‘none’, ‘use_polarity’, 30, 10, ModelID)*创建用于匹配的基于形状的模型。注意ImageROI是截取的原图像一部分
    inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion, 1, 30)*检查某个金字塔层数和参数下的模型的状态,就是为了确定,指定参数下能不能生成有效的特征,这个要人看一看的。
    get_shape_model_contours (ShapeModel, ModelID, 1)*创建形状模型的轮廓线条表示
    dev_clear_window ()*删除激活窗口的内容
    dev_set_color (‘blue’)*设置输出颜色
    dev_display (ShapeModelRegion)
    stop ()
  • step 1: create variables describing the measurement ROIs and display them
    Rect1Row := 244
    Rect1Col := 73
    DistColRect1Rect2 := 17
    Rect2Row := Rect1Row
    Rect2Col := Rect1Col + DistColRect1Rect2
    RectPhi := rad(90)
    RectLength1 := 122
    RectLength2 := 2
    gen_rectangle2 (MeasureROI1, Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2)
    gen_rectangle2 (MeasureROI2, Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2)
    **创建任意方向的矩形。此处指定的相关信息的
    dev_display (ModelImage)
    dev_set_color (‘yellow’)
    dev_display (MeasureROI1)
    dev_display (MeasureROI2)
  • translate measurement ROIs to lie on XLD model (without clipping!)
    get_system (‘clip_region’, OriginalClipRegion)*获取某个系统的当前值
    set_system (‘clip_region’, ‘false’)*设置halcon系统参数
    move_region (MeasureROI1, MeasureROI1Ref, -CenterROIRow, -CenterROIColumn)
    move_region (MeasureROI2, MeasureROI2Ref, -CenterROIRow, -CenterROIColumn)
  • 使用给定vector转换输入图形
    set_system (‘clip_region’, OriginalClipRegion)
    DistRect1CenterRow := Rect1Row - CenterROIRow
    DistRect1CenterCol := Rect1Col - CenterROIColumn
    DistRect2CenterRow := Rect2Row - CenterROIRow
    DistRect2CenterCol := Rect2Col - CenterROIColumn
    if (USING_TRANSLATE_MEASURE != 0)
    • -> measure objects are created only once in advance and then translated later
      gen_measure_rectangle2 (Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2, Width, Height, ‘bilinear’, MeasureHandle1)
      gen_measure_rectangle2 (Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2, Width, Height, ‘bilinear’, MeasureHandle2)
      endif
      stop ()
  • step 2: find the objects in another image
    read_image (SearchImage, ‘razors2’)
    dev_display (SearchImage)
    find_shape_model (SearchImage, ModelID, 0, 0, 0.8, 0, 0.5, ‘least_squares’, 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)* 在图像中,找到基于形状模型的最佳匹配
    if (|Score| > 0)
    for i := 0 to |Score| - 1 by 1
    * step 3: determine the affine transformation
    vector_angle_to_rigid (0, 0, 0, RowCheck[i], ColumnCheck[i], AngleCheck[i], MovementOfObject)
    affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
    dev_display (ModelAtNewPosition)
    * step 4: measure width and distance of the teeth
    * -> display the moved ROIs
    affine_trans_region (MeasureROI1Ref, MeasureROI1AtNewPosition, MovementOfObject, ‘constant’)
    affine_trans_region (MeasureROI2Ref, MeasureROI2AtNewPosition, MovementOfObject, ‘constant’)
    dev_display (MeasureROI1AtNewPosition)
    dev_display (MeasureROI2AtNewPosition)
    affine_trans_pixel (MovementOfObject, DistRect1CenterRow, DistRect1CenterCol, Rect1RowCheck, Rect1ColCheck)
    affine_trans_pixel (MovementOfObject, DistRect2CenterRow, DistRect2CenterCol, Rect2RowCheck, Rect2ColCheck)
    if (USING_TRANSLATE_MEASURE != 0)
    * -> translate the already created measure objects
    translate_measure (MeasureHandle1, Rect1RowCheck, Rect1ColCheck)
    translate_measure (MeasureHandle2, Rect2RowCheck, Rect2ColCheck)
    measure_pairs (SearchImage, MeasureHandle1, 2, 25, ‘negative’, ‘all’, RowEdge11, ColEdge11, Amp11, RowEdge21, ColEdge21, Amp21, Width1, Distance1)
    measure_pairs (SearchImage, MeasureHandle2, 2, 25, ‘negative’, ‘all’, RowEdge12, ColEdge12, Amp12, RowEdge22, ColEdge22, Amp22, Width2, Distance2)
    else
    * -> create new measure objects and destroy them after the measurement
    RectPhiCheck := RectPhi + AngleCheck[i]
    gen_measure_rectangle2 (Rect1RowCheck, Rect1ColCheck, RectPhiCheck, RectLength1, RectLength2, Width, Height, ‘bilinear’, MeasureHandle1)
    gen_measure_rectangle2 (Rect2RowCheck, Rect2ColCheck, RectPhiCheck, RectLength1, RectLength2, Width, Height, ‘bilinear’, MeasureHandle2)
    * step 5: perform the measurement
    measure_pairs (SearchImage, MeasureHandle1, 2, 25, ‘negative’, ‘all’, RowEdge11, ColEdge11, Amp11, RowEdge21, ColEdge21, Amp21, Width1, Distance1)
    measure_pairs (SearchImage, MeasureHandle2, 2, 25, ‘negative’, ‘all’, RowEdge12, ColEdge12, Amp12, RowEdge22, ColEdge22, Amp22, Width2, Distance2)
    close_measure (MeasureHandle1)
    close_measure (MeasureHandle2)
    endif
    * step 6: check for too short or missing teeth
    NumberTeeth1 := |Width1|
    NumberTeeth2 := |Width2|
    dev_set_color (‘red’)
    if (NumberTeeth1 < 37)
    for j := 0 to NumberTeeth1 - 2 by 1
    if (Distance1[j] > 4.0)
    RowFault := round(0.5 * (RowEdge11[j + 1] + RowEdge21[j]))
    ColFault := round(0.5 * (ColEdge11[j + 1] + ColEdge21[j]))
    disp_rectangle2 (WindowHandle, RowFault, ColFault, 0, 4, 4)
    dev_open_window (0, Width + 20, 80, 80, ‘black’, WindowHandleZoom)
    dev_set_part (RowFault - 10, ColFault - 10, RowFault + 10, ColFault + 10)
    dev_display (SearchImage)
    disp_rectangle2 (WindowHandleZoom, RowFault, ColFault, 0, 4, 4)
    stop ()
    dev_close_window ()
    dev_set_part (0, 0, Height - 1, Width - 1)
    endif
    endfor
    endif
    if (NumberTeeth2 < 37)
    for j := 0 to NumberTeeth2 - 2 by 1
    if (Distance2[j] > 4.0)
    RowFault := round(0.5 * (RowEdge12[j + 1] + RowEdge22[j]))
    ColFault := round(0.5 * (ColEdge12[j + 1] + ColEdge22[j]))
    disp_rectangle2 (WindowHandle, RowFault, ColFault, 0, 4, 4)
    dev_open_window (0, Width + 20, 80, 80, ‘black’, WindowHandleZoom)
    dev_set_part (RowFault - 10, ColFault - 10, RowFault + 10, ColFault + 10)
    dev_display (SearchImage)
    disp_rectangle2 (WindowHandleZoom, RowFault, ColFault, 0, 4, 4)
    stop ()
    dev_close_window ()
    dev_set_part (0, 0, Height - 1, Width - 1)
    endif
    endfor
    endif
    dev_set_color (‘yellow’)
    stop ()
    endfor
    endif
  • ------------------- end of the application -----------------
  • clean up
    if (USING_TRANSLATE_MEASURE != 0)
    close_measure (MeasureHandle1)
    close_measure (MeasureHandle2)
    endif
    dev_update_window (‘on’)
    clear_shape_model (ModelID)

代码注释到此为止。


总揽全局,看一下思路
就是基于形状的模板匹配:选取roi,创建模板,使用模板,将找到的结果图映射到原本图像,分析缺陷的形态学信息。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值