利用三幅光度立体图像来恢复物体表面3D模型的快速算法,根据向量场的分布建立关于物体表面深度信息的超定线性方程组,在最小二乘意义下求得物体表面的深度值.该算法能从已知光照条件下的三幅光度立体图像中恢复任意没有遮挡面物体表面的三维结构,形成以单个像素为网格精度的物体表面的多面体模型.实际计算表明该算法计算速度快,能适应任意连续性的物体表面的3D模型重建并且不受其表面反射系数的影响。
采用不同光照条件下拍摄的多幅图像,利用光度立体技术对织物表面进行3D重建.首先根据物体表面的照度方程,引入广义逆的概念求解物体表面方向进而确定表面梯度,再运用线积分计算表面高度,结合变分和有限差分思想对所得拟合表面进行进一步的迭代和修正,获得最佳重建表面.将该算法运用到AATCC织物平整度模板图像的三维重建,可获取三维深度信息,并结合4个特征值表征织物起皱程度.。
改进光度立体视觉方法,尤其适用于表面检测
在工业领域,表面检测是一个非常广泛的应用领域。使用HALCON 11中增强的光度 立体视觉 方法,三维表面检测被加强。利用阴影可方便快速的检测物体表面的缺口或凹痕。
注意:光度立体不适用于绝对高度的重建,即,它不能替代典型的3D重建算法,例如距焦点或光的深度。
*这个程序演示了光度立体技术的使用
*用于检查和阅读药品上的盲文
* package. 输入4张图片取自药品包装
* 来自不同方向的光。
*
* 初始化
dev_close_window ()
dev_update_off ()
read_image (Images, 'photometric_stereo/braille_0' + [1:4])
select_obj (Images, Image, 1)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_colored (12)
dev_display (Image)
Message := '检查和阅读药品包装上的盲文'
Message[1] := '使用光度立体'
Message[2] := '在这种情况下,使用了四种不同的光线方向。'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 这个代码表在十六进制表示法之间映射
* 点字图案和相应的字符.
* 在这种情况下,使用的是德语6点代码.
CodeTable := ['','a',',','b','.','k',';','l','´','c','i','f','äu','m','s','p','','e',':','h','*','o','!','r','CAPS','d','j','g','ä','n','t','q','lcase','au','?','eu','-','u','"','v','Cap','ei','ö','','ie','x','ß','','','sch','','ü','"','z','()','','','ch','w','','','y','st','']
*
* 显示输入图像与不同的照明
for I := 1 to 4 by 1
Message := 'Acquire image ' + I + ' of 4'
select_obj (Images, ObjectSelected, I)
dev_display (ObjectSelected)
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
wait_seconds (0.5)
endfor
*可用于将对象的三维形状与二维纹理区分开
*参数一 图像集(input_object)
*参数二 重建的高度场(output_object)
*参数三 表面的梯度场(output_object)
*参数四 表面的反照率(output_object)
*参数五 相机和照明方向之间的角度(input_control) `
*参数六 物平面内照明方向的角度(input_control)
*参数七 请求结果的类型(input_control)
*参数八 重建方法的类型(input_control)
*参数九 通用参数的名称(input_control)
*参数十 通用参数的值(input_control)
photometric_stereo (Images, HeightField, Gradient, Albedo, [41.4,42.6,41.7,40.9], [6.1,95.0,-176.1,-86.8], ['gradient','albedo'], 'poisson', [], [])
*
* 显示反照率图像
dev_display (Albedo)
disp_message (WindowHandle, 'The albedo image still has some artefacts', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
*计算曲面的平均曲率
*使用渐变字段作为操作符的输入
* derivate_vector_field.
*将向量场的分量与高斯的导数进行卷积,并计算从中导出的各种特征
*参数一 向量字段(input_object)
*参数二 过滤后的结果图像(output_object)
*参数三 高斯的西格玛(input_control)
*参数四 要计算的分量(input_control)
derivate_vector_field (Gradient, MeanCurvature, 1, 'mean_curvature')
*
*在曲率图像中分割点是很容易的
dev_display (MeanCurvature)
disp_message (WindowHandle, 'But it is easy to segment the dots in the curvature image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*以下为盲文解码部分
*
* Segment dots
threshold (MeanCurvature, Regions, -0.14, -0.017)
connection (Regions, ConnectedRegions)
dilation_circle (ConnectedRegions, RegionDilation, 1.5)
select_shape (RegionDilation, Braille, ['area','roundness'], 'and', [191.82,0.8108], [360.12,1])
union1 (Braille, RegionUnion)
*
* 把点分组成单词和字符
closing_rectangle1 (Regions, RegionClosing, 90, 40)
connection (RegionClosing, ConnectedRegions)
shape_trans (ConnectedRegions, RegionTrans, 'rectangle1')
select_shape (RegionTrans, SelectedRegions, 'height', 'and', 50, 90)
dilation_rectangle1 (SelectedRegions, RegionDilation1, 21, 1)
partition_dynamic (RegionDilation1, Partitioned, 72, 5)
intersection (Partitioned, RegionUnion, Letters)
*
* 显示分割结果
dev_display (MeanCurvature)
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Partitioned)
dev_display (Letters)
disp_message (WindowHandle, 'Result', 'window', 12, 12, 'black', 'true')
*
* Decode text letter by letter
count_obj (Letters, NumLetters)
for I := 1 to NumLetters by 1
*
* 为矩形内的六个点扇区定义边框
select_obj (Partitioned, CurrentRectangle, I)
region_features (CurrentRectangle, ['row1','height','column'], Limits)
MaxFirstRow := Limits[0] + Limits[1] / 3.0
MaxSecondRow := Limits[0] + Limits[1] * 2 / 3.0
MaxFirstColumn := Limits[2]
*
* Decode the letter dot by dot
*
* Code values calculated depending
* on the presence of dots using
* the following scheme:
* (1) ( 8)
* (2) (16)
* (4) (32)
* If a dot is present, the corresponding
* value is added to the Code.
* This way, 2^6 = 64 different codes are possible.
select_obj (Letters, CurrentLetter, I)
connection (CurrentLetter, Dots)
count_obj (Dots, NumDots)
Code := 0
for J := 1 to NumDots by 1
select_obj (Dots, CurrentDot, J)
area_center (CurrentDot, _Area, Row, Column)
if (Column <= MaxFirstColumn)
if (Row <= MaxFirstRow)
* Left upper (1)
Code := Code + 1
elseif (Row <= MaxSecondRow)
* Left middle (2)
Code := Code + 2
else
* Left lower (4)
Code := Code + 4
endif
else
if (Row <= MaxFirstRow)
* Right upper (8)
Code := Code + 8
elseif (Row <= MaxSecondRow)
* Right middle (16)
Code := Code + 16
else
* Right lower (32)
Code := Code + 32
endif
endif
endfor
Character[I - 1] := CodeTable[Code]
disp_message (WindowHandle, CodeTable[Code], 'image', Limits[0] + Limits[1], Limits[2] - 20, 'black', 'true')
endfor
photometric_stereo 根据光度立体技术重建曲面
derivate_vector_field 将向量场的分量与高斯的导数进行卷积,并计算从中导出的各种特征
[backcolor=&]
步骤:
1.通过photometric_stereo算子获得表面梯度图像
该算子可以得到表面梯度图像和反照率图像。需要输入多张从不同角度照明所得到的图像。
2.通过derivate_vector_field算子获得高斯曲率图像
该算子中需要输入表面梯度图像。
光度立体图像的典型应用是检测代表缺陷的表面微小不一致性,或者从例如用于非平面字符的印刷检查的图像中排除光的方向的影响。
基于伍德汉姆(Woodham)的算法,因此,一方面假设摄像机执行了正射投影。即,必须使用远心镜头或长焦距镜头。另一方面,假设每个光源都发出平行且均匀的光束。也就是说,您必须使用强度均匀的远心照明光源,或者使用远点光源。另外,物体必须具有朗伯反射特性,即它必须以散射方式反射入射光。具有镜面反射特性(即镜面或光泽表面)的对象或对象区域无法正确处理,因此会导致错误的结果。
在获取图像期间,相机相对于场景的方向不得改变。相反,对于至少三个灰度值图像,照明相对于相机的方向必须改变。