*本项目演示了用光度立体技术检查地板孔洞缺陷。
*输入的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