halcon缺陷检测学习6地板缺陷inspect_flooring_photometric_stereo

金坚
2023-12-01

*本项目演示了用光度立体技术检查地板孔洞缺陷。
*输入的4张图片来自地板面板,光线来自不同的方向
*
*

  • 初始化
    dev_close_window ()
    dev_update_off ()
    dev_open_window (0, 0, 640, 512, ‘black’, WindowHandle)
    *打开图形窗口,定义参考点与大小
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    *定义窗口显示文字格式
    Message := ‘Inspect the label of flooring panels’
    Message[1] := ‘using photometric stereo. In this case four’
    Message[2] := ‘different light orientations were used.’
    *三行显示内容
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    *定义一个文本框显示上面的内容
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *定义提示继续的文本框
    stop ()
    for Index := 1 to 2 by 1
    *
    • 以不同的光照显示输入图像
      read_image (Images, ‘photometric_stereo/flooring_’ + Index + ‘_0’ + [1:4])
      *读入四张图片
      for I := 1 to 4 by 1
      Message := ‘Acquire image ’ + I + ’ of 4’
      select_obj (Images, ObjectSelected, I)
      *将带有索引(从1开始)的图标对象从图标输入对象元组对象复制到输出对象。
      *输入的元组(Images)复制后的对象(ObjectSelected)要选择的对象的索引(I)
      dev_display (ObjectSelected)
      *显示复制后的图片
      disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
      wait_seconds (0.5)
      *每更换一个图片等待0.5s
      endfor
    *应用光度立体视觉来确定反照率和表面梯度。
    *
    Slants := [39.4,40.5,39.5,38.4]
    *偏锋。物体平面与光照方向之间的角度(单位为度)。
    Tilts := [-6.0,83.7,172.9,-98.2]
    *倾斜。物体平面内光照方向的角度(单位为度)
    ResultType := [‘gradient’,‘albedo’]
    *输出结果的类型。[“梯度”、“反照率”].
    photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, ‘poisson’, [], [])
    • 光度立体技术重建一个表面。具有至少三个不同光照方向的输入图像数组(Images)重建的高度(HeightField)
      *表面的梯度图像(Gradient)表面的反照率图像(Albedo)参上 参上 参上 重构方法的类型(泊松分布)
      *泛型参数的类型与值(默认为空)
    *显示反照率图像
    dev_display (Albedo)
    *显示反照率图像
    disp_message (WindowHandle, ‘Albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)
    *定义显示如图信息对话框
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *定义提示继续运行的文本框,内容为默认
    stop ()
    *
    *
    *计算曲面的高斯曲率。
    *在曲率图像中缺陷通常很容易检测到。
    derivate_vector_field (Gradient, MeanCurvature, 1.0, ‘mean_curvature’)
    *用高斯函数的导数卷积向量场。
    *输入向量场(Gradient)过滤后的结果图像( MeanCurvature)高斯函数的变量(1)待计算分量(平均曲率)
    *
    *缺陷检测
    • 在曲率图像中分割平板区域
      threshold (MeanCurvature, Region, 0.02, 1000)
      *利用全局阈值算子分割图像。输入的图片(MeanCurvature)分割后(Region)阈值(0.02,1000)
      *分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
      connection (Region, Defects)
      *计算区域的连通分量。参数:输入的图片(Region)连接组件(Defects)
      area_center (Defects, Area, Row, Column)
      *得到缺陷区域中心。待检查区域(Defects)选择区域的大小(Area)中心坐标(Row, Column)
      gen_circle (Circle, Row, Column, sqrt(Area) + 10)
      *创建一个圆。生成的圆(Circle)圆心坐标索引(Row, Column)实心圆的半径(缺陷区域加10)

    • 在曲率图像中显示缺陷
      dev_set_draw (‘margin’)
      *定义圆区域填充模式(边缘)
      dev_set_color (‘red’)
      *圆为红色
      dev_set_line_width (2)
      *圆宽2
      dev_display (MeanCurvature)
      *显示曲率图像
      dev_display (Circle)
      *显示定义的圆
      Message := ‘The defects can easily be detected’
      Message[1] := ‘in the surface curvature image’
      disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
      *显示文本框,内容如上
      stop ()

    • 在反照像中显示缺陷
      dev_set_draw (‘margin’)
      **定义圆区域填充模式(边缘)
      dev_set_color (‘red’)
      *圆为红色
      dev_display (Albedo)
      *显示反照图
      dev_display (Circle)
      disp_message (WindowHandle, ‘Defects in albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)
      *显示文本框。
      if (Index < 2)
      disp_continue_message (WindowHandle, ‘black’, ‘true’)
      *当图片没有显示完时,显示提醒文本框
      stop ()
      endif
      endfor

 类似资料: