10分钟小白都可以看懂的光度立体法以及运用到项目

10分钟小白都可以看懂的光度立体法以及运用到项目

利用三幅光度立体图像来恢复物体表面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=&amp]
步骤:
1.通过photometric_stereo算子获得表面梯度图像
该算子可以得到表面梯度图像和反照率图像。需要输入多张从不同角度照明所得到的图像。
2.通过derivate_vector_field算子获得高斯曲率图像
该算子中需要输入表面梯度图像。

光度立体法的典型应用:

光度立体图像的典型应用是检测代表缺陷的表面微小不一致性,或者从例如用于非平面字符的印刷检查的图像中排除光的方向的影响。

光度立体法的局限性:

基于伍德汉姆(Woodham)的算法,因此,一方面假设摄像机执行了正射投影。即,必须使用远心镜头或长焦距镜头。另一方面,假设每个光源都发出平行且均匀的光束。也就是说,您必须使用强度均匀的远心照明光源,或者使用远点光源。另外,物体必须具有朗伯反射特性,即它必须以散射方式反射入射光。具有镜面反射特性(即镜面或光泽表面)的对象或对象区域无法正确处理,因此会导致错误的结果。

采集设置:

在获取图像期间,相机相对于场景的方向不得改变。相反,对于至少三个灰度值图像,照明相对于相机的方向必须改变。

关注苏州程序大白,持续更新技术分享。谢谢大家支持

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
光度立体是指利用两个或多个图像之间的光度信息来进行立体匹配和深度估计的一种方。该方基于一个简单的观察,即同一物体在不同位置的图像上具有相似的灰度值。因此,通过比较不同位置上的像素的灰度值,可以找到同一物体在不同图像上的对应点。 光度立体的具体实现包括以下步骤: 1. 图像预处理:对输入的图像进行去噪、灰度化等处理,以便于后续的计算。 2. 构建代价体:对每个像素点,在另一幅图像上搜索其在一定搜索范围内的对应点,并计算两个像素之间的差异程度作为代价值。通常,差异程度越小代表匹配越准确。 3. 匹配代价体:通过比较两个像素的代价值,选择代价最小的匹配对应点作为最佳匹配。 4. 深度估计:通过代价最小匹配点的位置信息,结合相机参数和图像坐标信息,可以估计出物体的深度信息。 光度立体的优点是简单易实现,不需要复杂的设备,只需要使用普通的相机进行拍摄即可。然而,由于该方基于灰度信息,对纹理不明显或存在光照变化的区域,匹配效果会变差。此外,由于该方只利用了图像的灰度信息,对于透明物体或者反射物体的深度估计会存在一定的困难。 综上所述,光度立体是一种简单直观的立体匹配方,对于一些简单场景的深度估计可以得到比较准确的结果,但在复杂场景中存在一些限制。在实际应用中,可以结合其他方,如结构光立体或者深度学习方,来提高立体匹配的精度和鲁棒性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏州程序大白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值