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

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

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


利用三幅光度立体图像来恢复物体表面3D模型的快速算法,根据向量场的分布建立关于物体表面深度信息的超定线性方程组,在最小二乘意义下求得物体表面的深度值.该算法能从已知光照条件下的三幅光度立体图像中恢复任意没有遮挡面物体表面的三维结构,形成以单个像素为网格精度的物体表面的多面体模型.实际计算表明该算法计算速度快,能适应任意连续性的物体表面的3D模型重建并且不受其表面反射系数的影响。

采用不同光照条件下拍摄的多幅图像,利用光度立体技术对织物表面进行3D重建.首先根据物体表面的照度方程,引入广义逆的概念求解物体表面方向进而确定表面梯度,再运用线积分计算表面高度,结合变分和有限差分思想对所得拟合表面进行进一步的迭代和修正,获得最佳重建表面.将该算法运用到AATCC织物平整度模板图像的三维重建,可获取三维深度信息,并结合4个特征值表征织物起皱程度.。

改进光度立体视觉方法,尤其适用于表面检测

在工业领域,表面检测是一个非常广泛的应用领域。使用HALCON 11中增强的光度 立体视觉 方法,三维表面检测被加强。利用阴影可方便快速的检测物体表面的缺口或凹痕。


注意:光度立体不适用于绝对高度的重建,即,它不能替代典型的3D重建算法,例如距焦点或光的深度。


20210524093653632.png


20210524093705701.png


*这个程序演示了光度立体技术的使用
*用于检查和阅读药品上的盲文
* 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)的算法,因此,一方面假设摄像机执行了正射投影。即,必须使用远心镜头或长焦距镜头。另一方面,假设每个光源都发出平行且均匀的光束。也就是说,您必须使用强度均匀的远心照明光源,或者使用远点光源。另外,物体必须具有朗伯反射特性,即它必须以散射方式反射入射光。具有镜面反射特性(即镜面或光泽表面)的对象或对象区域无法正确处理,因此会导致错误的结果。


采集设置:


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


相关文章
|
3月前
|
人工智能 自然语言处理
Sora如何用?小白教程,一文带你看清
仅仅凭借文字就可以生成一段视频!近日,OpenAI的一款新产品又火出圈了。当地时间周四(2月15日),OpenAI发布了首个文生视频模型Sora。 2024年2月16日,OpenAI在官网上正式宣布推出**文本生成视频**的[大模型 Sora](https://openai.com/sora),该工具可以通过使用文本迅速制作出一段长达60秒的视频,视频中可以呈现多个角色、特定动作、以及复杂场景。OpenAI的官网上现已更新了48个视频案例,可以说是效果逼真,能展现艳丽的色彩,呈现准确的细节,连人物角色都是表情丰富。
|
2月前
|
前端开发 JavaScript
前端复刻经典小游戏之飞机大战(一)
前端复刻经典小游戏之飞机大战(一)
38 1
|
2月前
|
JSON 定位技术 开发工具
技术经验解读:一步步实现仿制AndroidLOL多玩盒子(一)概览
技术经验解读:一步步实现仿制AndroidLOL多玩盒子(一)概览
18 0
|
2月前
|
前端开发 JavaScript 安全
前端复刻经典小游戏之飞机大战(三)
前端复刻经典小游戏之飞机大战(三)
30 0
|
2月前
|
前端开发 JavaScript 测试技术
前端复刻经典小游戏之飞机大战(二)
前端复刻经典小游戏之飞机大战(二)
68 0
|
3月前
|
C# 图形学
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
292 2
|
3月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
251 0
|
3月前
|
前端开发 JavaScript SEO
学成在线制作【网页布局实战】
学成在线制作【网页布局实战】
94 0
|
8月前
|
前端开发
前端必学——实现电商图片放大镜效果(附代码)
放大镜可以说是前端人必须学会的程序之一,今天的案例为大家展示一下怎么实现放大镜的效果! 效果图展示   整个效果就是当鼠标放到展示图上的时候,会出现一个遮罩层以及弹出来一个框展示一个详情图,并且鼠标移动的时候详情图跟着移动,鼠标离开详情图消失。
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-旅游地图重构2
前端学习笔记202305学习笔记第二十三天-旅游地图重构2
43 0
前端学习笔记202305学习笔记第二十三天-旅游地图重构2